LeetCode Target Sum
原题链接在这里:https://leetcode.com/problems/target-sum/description/
题目:
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols +
and -
. For each integer, you should choose one from +
and -
as its new symbol.
Find out how many ways to assign symbols to make sum of integers equal to target S.
Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3.
Output: 5
Explanation: -1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3 There are 5 ways to assign symbols to make the sum of nums be target 3.
Note:
- The length of the given array is positive and will not exceed 20.
- The sum of elements in the given array will not exceed 1000.
- Your output answer is guaranteed to be fitted in a 32-bit integer.
题解:
List some examples. e.g. 1,1,1,1,1.
If all of them are positive, it is 5, all negitative, it is -5. Beyond [-5,5], it can't happen, thus, the ways count is 0.
For this sum question, let dp[i] denotes the sum up to i, the count of ways.
Iterate each num in nums. For num, it could be + or -. say first 1. Then it could -1 or 1.
The ways to -1 is 1, ways to 1 is 1. It is because dp[0] accumlate to dp[1] and dp[-1].
递推时, 上个可能结果或加或减当前num得到新的结果, 不同ways的数目在新结果下累计. 只有对应count大于0时才可能是上个可能结果, because it would not be out of index.
起始值dp[0 + sum] = 1. 可能结果为0的不同ways数目是1. sum is offset. dp[0] means sum up to -sum.
Time Complexity: O(sum * n). sum是nums所有num的和. n = nums.length
Space: O(sum).
AC Java:
class Solution {
public int findTargetSumWays(int[] nums, int S) {
if(nums == null || nums.length == 0){
return 0;
} int sum = 0;
for(int num : nums){
sum += num;
} if(sum < S || -sum > S){
return 0;
} int [] dp = new int[2*sum+1];
//sum相当于 offset
dp[0+sum] = 1;
for(int num : nums){
int [] next = new int[2*sum+1];
for(int k = 0; k<2*sum+1; k++){
if(dp[k] > 0){
next[k+num] += dp[k];
next[k-num] += dp[k];
}
}
dp = next;
}
return dp[sum + S];
}
}
Method 2:
nums中一部分用的+号 相当于positive, 另一部分用的 - 号相当于negative. 分成两组.
sum(p) - sum(n) = target.
sum(p) + sum(n) + sum(p)-sum(n) = target + sum(p) + sum(n)
2*sum(p) = target + sum(nums)
相当于在nums中找有多少种subarray, subarray自身的和是(target + sum(nums))/2的问题.
subSum求解这个转化问题.
存储到当前数字得到所有结果ways数目. 为什么循环中i要从大到小呢. 这其实是dp的space compression.
update新的dp时会用到上一轮前面的值,所以要从后往前更新. 这样更新时保证用到的都是上轮的值.
Time Complexity: O(sum*nums.length). sum是nums所有num的和.
Space: O(sum).
AC Java:
class Solution {
public int findTargetSumWays(int[] nums, int S) {
int sum = 0;
for(int num : nums){
sum += num;
} if(S < -sum || S > sum || (S+sum)%2 != 0){
return 0;
} return subSum(nums, (S+sum)/2);
} private int subSum(int [] nums, int target){
int [] dp = new int[target+1];
dp[0] = 1;
for(int num : nums){
for(int i = target; i>=num; i--){
dp[i] += dp[i-num];
}
} return dp[target];
}
}
LeetCode Target Sum的更多相关文章
- [LeetCode] Target Sum 目标和
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symb ...
- Leetcode——Target Sum
Question You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you ha ...
- Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)
Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...
- [Leetcode] DP -- Target Sum
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symb ...
- LN : leetcode 494 Target Sum
lc 494 Target Sum 494 Target Sum You are given a list of non-negative integers, a1, a2, ..., an, and ...
- Longest subarray of target sum
2018-07-08 13:24:31 一.525. Contiguous Array 问题描述: 问题求解: 我们都知道对于subarray的问题,暴力求解的时间复杂度为O(n ^ 2),问题规模已 ...
- LeetCode:Path Sum I II
LeetCode:Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...
- [leetcode] Combination Sum and Combination SumII
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)
剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...
随机推荐
- 最小化CentOS6.7(64bit)---安装mysql5.5、jdk、tomcat
********mysql******** ------------------------------------------------------------------------------ ...
- openstack ocata版(脚本)控制节点安装
一.初始化环境: 1.更换yum源: yum install -y wget mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS- ...
- dict字典常用方法总结,数据解构(解包)
dict {'name':'holle'}字典存储大量关联型数据,可迭代的,最多只有200个键.查询数据速度非常快,符合二分查找(有100个数比如找75会先找到50然后判断,所以2^7次方7次即可找到 ...
- java多线程笔记
一,线程的状态 1,新建状态:新创建了一个线程对象 2,就绪状态:线程创建对象后,线程调用star()的方法,等待获取CPU的使用权. 3,运行状态:获取了cpu的使用权,执行程序代码 4,阻塞状态: ...
- JSP笔记05——生命周期(转)
原始内容:https://www.tutorialspoint.com/jsp/jsp_life_cycle.htm 在这一章中,我们将讨论JSP的生命周期. 理解JSP低层次功能的关键在于——理解它 ...
- VS中一个强大的功能,将Json或者XML黏贴为类
有时候需要传递json,或者是json结构复杂,看的杂乱无章,我们可以将这个json复制下来,然后将它写成类的形式,VS中已经帮我们很好的实现了这个功能,我们只需要选择 编辑===>> ...
- Vue.js学习笔记 第五篇 事件处理
监听事件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- 数据库系统概论学习3-SQL 语句和关系代数(一)SQL 入门
3. SQL 语句和关系代数(一)SQL 入门 3.1 数据库的编程语言 SQL 的优点 SQL 集成了数据查询(data query).数据操作(data manipulation).数据定义(da ...
- L1范数与L2范数正则化
2018-1-26 虽然我们不断追求更好的模型泛化力,但是因为未知数据无法预测,所以又期望模型可以充分利用训练数据,避免欠拟合.这就要求在增加模型复杂度.提高在可观测数据上的性能表现得同时,又需要兼顾 ...
- C++中容器的使用(二)
第一章容器 第1条:慎重选择容器类型. 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器 ...