1 Solution Accepted / Used 时空复杂度 O(n) O(n)
题目链接:https://leetcode.cn/problems/subarray-sum-equals-k/
给出一个整数数组和K,统计和为K的子数组的个数
Example:
input:nums = [1,1,1], k = 2
output:2
class Solution {
//哈希表的存储复杂度都是O(1),所以总的复杂度为O(n)
public int subarraySum(int[] nums, int k) {
/*
将子段和映射为,前缀和
定义状态,以a[i]为结尾子段和为k的序列,i= 0,1,...n,对所以状态求和即可
注意:如果以a[i]为起点,显然:结果是会重复的
实现:对于前i个数,以a[i]为终点,子序列和为k 可以映射为-->前缀和 sum[i]-k
*/
HashMap<Integer,Integer> map = new HashMap<>();
//特殊情况: 以a[i]为终点子序列和为k,这种序列为k==sum[i],起点都为a[0],显然hash初始化要put(0,1)
map.put(0,1);
int ans = 0;
int sum = 0;//前缀和
for(int i = 0; i < nums.length; ++i) {
sum += nums[i];
ans += map.getOrDefault(sum-k,0);
map.put(sum,map.getOrDefault(sum,0)+1);
}
return ans;
}
}