560 和为K的子数组 Java解法

888 阅读1分钟

560 和为K的子数组

把到每个位置和之前的位置的总和给记录下来,每次和都存到sum变量上,如果有两个位置的sum的差为K就表示,这两个位置之间的和为K。

用个哈希表存储,key为sum,value是sum出现的次数,也就是每个起点的数量,我们先来看一下代码:

public static int subarraySumBetter(int[] nums, int k) {
	HashMap<Integer, Integer> map = new HashMap<>();
	int result = 0;
	int sum = 0;
	map.put(0, 1);
	for (int i = 0; i < nums.length; i++) {
		sum += nums[i];
		if(map.containsKey(sum-k))
			result += map.get(sum-k);
		// result += map.getOrDefault(sum - k, 0);
		int t = map.getOrDefault(sum, 0) + 1;
		map.put(sum, t);
	}
	return result;
}
public static void main(String[] args) {
	int[] test1  = {1,1,1,1,1,1,1,0,1,1};
	System.out.println(subarraySumBetter(test1, 3));
}

我们来看看这个这些个值的变化情况,下面就是参数的变化的值示意图