题目链接:https://leetcode.cn/problems/subarray-sum-equals-k/description/?envType=study-plan-v2&envId=top-100-liked
枚举
枚举所有情况
class Solution {
public int subarraySum(int[] nums, int k) {
int n = nums.length;
int ans = 0;
for(int i = 0; i < n; i++){
int sum = 0;
for(int j = i; j < n; j++){
sum += nums[j];
if(sum == k){
ans++;
}
}
}
return ans;
}
}
前缀和、哈希表
存储前缀 pre 和到哈希表中,然后每次查找 pre - k
class Solution {
public int subarraySum(int[] nums, int k) {
int n = nums.length;
//用哈希表存储,键为前缀和,值为前缀和出现数量
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
//计算前缀和
int pre = 0;
//存储答案
int ans = 0;
//储存键值对(0,1)
map.put(0, 1),因为可能前几个就是答案,pre - k = 0 情况
//遍历数组
for(int i = 0; i < n; i++){
//累加前缀和
pre += nums[i];
//判断是否有键为 pre - k
if(map.containsKey(pre - k)){
//累加答案
ans += map.get(pre - k);
}
//getOrDeault: 如果 map 已经有键 pre,那就返回值,否则返回0
map.put(pre, map.getOrDefault(pre, 0) + 1);
}
return ans;
}
}
还剩90题!