数组子序列之和等于k
class Solution {
public int subarraySum(int[] nums, int k) {
// 第一种方法,时间复杂度太高O(n^2)
// int sum = 0;
// for(int i=0;i<nums.length;i++){
// for(int j=0;j<=i;j++){
// if(sum(nums,j,i) == k){
// sum++;
// }
// }
// }
// return sum;
// 第二种方法,时间复杂度为O(nlogn)
// int sum = 0;
// int count = 0;
// for(int i=0;i<nums.length;i++){
// sum = nums[i];
// if(sum == k){
// count++;
// }
// int j=i;
// while(j<nums.length - 1){
// sum += nums[++j];
// if(sum == k){
// count++;
// }
// }
// }
// return count;
// 第三种方法,时间复杂度为O(n)
// sum[i,j] = sum[0,j] - sum[0,i-1]
// k = sum - hashMap-key
Map<Integer,Integer> preSum = new HashMap<>();
preSum.put(0,1);
int res = 0;
int sum = 0;
for(int i=0;i<nums.length;i++){
sum += nums[i];
if(preSum.containsKey(sum - k)){
res += preSum.get(sum - k);
}
preSum.put(sum,preSum.getOrDefault(sum,0) + 1);
}
return res;
}
public int sum(int[] nums,int start,int end){
int sum = 0;
for(int i=start;i<=end;i++){
sum += nums[i];
}
return sum;
}
}