给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例 1:
输入: nums: [1, 1, 1, 1, 1], S: 3
输出: 5
解释:
-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
一共有5种方法让最终目标和为3。
class Solution {
public int findTargetSumWays(int[] nums, int S) {
int i=0,len=nums.length;
HashMap<Integer,Integer> m1=new HashMap<Integer,Integer>();
m1.put(0, 1);
while(i<len) {
HashMap<Integer,Integer> m2=new HashMap<Integer,Integer>();
for(int x:m1.keySet()) {
int target1=x+nums[i],target2=x-nums[i],value=m1.get(x);
if(!m2.containsKey(target1))
m2.put(target1, value);
else
m2.put(target1, m2.get(target1)+value);
if(!m2.containsKey(target2))
m2.put(target2, value);
else
m2.put(target2, m2.get(target2)+value);
}
m1=m2;
i++;
}
if(m1.containsKey(S))
return m1.get(S);
else
return 0;
}
}
我的想法是动态规划,对于每一个数nums[i],将之前的答案+nums[i],-nums[i]全部记录下来,并且统计每一个数字出现的次数,所以我的hashmap中的key存储的是某一个组合得到的总和,value存储的是这个总和出现的次数。
这一题学会的东西:
1.Java已经实现的类非常强大
2.hashmap的put既是增加也是更改
3.HashMap的遍历有两种方式
(1)先得到键再得到value
for(int x:m1.keySet()) {
int value=m1.get(x);
}
(2)
for(Entry<Integer,Integer> x:m1.entrySet()) {
}