LeetCode 560:Subarray Sum Equals K
题意描述
给定一个整数数组和一个整数k,找出和为k的连续子数组的总数。
测试用例
Example 1:
Input:nums = [1,1,1], k = 2 Output: 2
解题思路
一、思路一
暴力解决
public int subarraySum(int[] nums, int k) {
int res = 0;
int len = nums.length;
for(int i=0;i<len;i++){
int sum = nums[i];
if(sum == k) res++;
for(int j=i+1;j<len;j++){
sum += nums[j];
if(sum == k) res ++;
}
}
return res;
}
二、思路二
如果【i,j】的累加和为k,那么i之前的累加和为sum1,j之前的累加和为sum2,则存在sum2 - sum1 = k
所以我们简历Map存储累计和sum出现的次数,如果sum-k存在于map中,则累加和为k的子数组一定存在。
public int subarraySum(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0,1); //初始加入0,例如nums【0】=10,k=10,如果0不在map中就少一个res
int res = 0;
int cur = 0;
for(int i=0;i<nums.length;i++){
cur += nums[i];
if(map.containsKey(cur-k)){
res += map.get(cur - k);
}
map.put(cur,map.getOrDefault(cur,0)+1);
}
return res;
}