HashMap -leetcode目标和

给定一个非负整数数组,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()) {

}

猜你喜欢

转载自blog.csdn.net/cobracanary/article/details/88616374
今日推荐