class Solution {
public int subarraySum(int[] nums, int k) {
int count=0;
int sum=0;
for(int right=0;right<nums.length;++right){
sum+=nums[right];
if(sum==k){
++count;
}
int temp=sum;
for(int left=0;left<right;++left){
temp-=nums[left];
if(temp==k){
++count;
}
}
}
return count;
}
}
笑死,慢到哭泣。
这题滑动窗口是没法知道什么时候能移动left指针的,num[i]可以为负数;也是没法用动态规划的,k可以为负数。最终用了前缀和这个方法
class Solution {
public int subarraySum(int[] nums, int k) {
int result=0;
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
int sum=0;
map.put(0, 1); //一定记得这一行,前缀和为0也有一种(即从i=0开始)
for(int i=0;i<nums.length;++i){
sum+=nums[i];
int need=sum-k;
if(map.containsKey(need)){
result+=map.get(need);
}
map.put(sum,map.getOrDefault(sum,0)+1);
}
return result;
}
}