LeetCode 560: Subarray Sum Equals K (Prefix Sum + Hash Map)
LeetCode 560Prefix SumHash MapToday we solve LeetCode 560 - Subarray Sum Equals K.
Source: https://leetcode.com/problems/subarray-sum-equals-k/
English
Problem Summary
Given an integer array nums and an integer k, return the number of continuous subarrays whose sum equals k.
Key Insight
If current prefix sum is pre, then any previous prefix sum pre-k forms a subarray ending here with sum k. So we count frequencies of prefix sums in a hash map.
Algorithm
Initialize map with {0:1}. Iterate nums, update pre, add count[pre-k] to answer, then increment count[pre].
Complexity
Time O(n), space O(n).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public int subarraySum(int[] nums, int k) {
java.util.Map<Integer, Integer> cnt = new java.util.HashMap<>();
cnt.put(0, 1);
int pre = 0, ans = 0;
for (int x : nums) {
pre += x;
ans += cnt.getOrDefault(pre - k, 0);
cnt.put(pre, cnt.getOrDefault(pre, 0) + 1);
}
return ans;
}
}func subarraySum(nums []int, k int) int {
cnt := map[int]int{0: 1}
pre, ans := 0, 0
for _, x := range nums {
pre += x
ans += cnt[pre-k]
cnt[pre]++
}
return ans
}class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int> cnt;
cnt[0] = 1;
int pre = 0, ans = 0;
for (int x : nums) {
pre += x;
if (cnt.count(pre - k)) ans += cnt[pre - k];
cnt[pre]++;
}
return ans;
}
};from collections import defaultdict
class Solution:
def subarraySum(self, nums: list[int], k: int) -> int:
cnt = defaultdict(int)
cnt[0] = 1
pre = ans = 0
for x in nums:
pre += x
ans += cnt[pre - k]
cnt[pre] += 1
return ansvar subarraySum = function(nums, k) {
const cnt = new Map();
cnt.set(0, 1);
let pre = 0, ans = 0;
for (const x of nums) {
pre += x;
ans += cnt.get(pre - k) || 0;
cnt.set(pre, (cnt.get(pre) || 0) + 1);
}
return ans;
};中文
题目概述
给定整数数组 nums 和整数 k,统计和恰好等于 k 的连续子数组数量。
核心思路
若当前前缀和为 pre,那么之前每个 pre-k 都能与当前位置组成一个和为 k 的子数组。用哈希表记录前缀和出现次数即可。
算法步骤
初始化 {0:1};遍历数组更新前缀和;答案累加 count[pre-k];再更新 count[pre]。
复杂度分析
时间复杂度 O(n),空间复杂度 O(n)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public int subarraySum(int[] nums, int k) {
java.util.Map<Integer, Integer> cnt = new java.util.HashMap<>();
cnt.put(0, 1);
int pre = 0, ans = 0;
for (int x : nums) {
pre += x;
ans += cnt.getOrDefault(pre - k, 0);
cnt.put(pre, cnt.getOrDefault(pre, 0) + 1);
}
return ans;
}
}func subarraySum(nums []int, k int) int {
cnt := map[int]int{0: 1}
pre, ans := 0, 0
for _, x := range nums {
pre += x
ans += cnt[pre-k]
cnt[pre]++
}
return ans
}class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int> cnt;
cnt[0] = 1;
int pre = 0, ans = 0;
for (int x : nums) {
pre += x;
if (cnt.count(pre - k)) ans += cnt[pre - k];
cnt[pre]++;
}
return ans;
}
};from collections import defaultdict
class Solution:
def subarraySum(self, nums: list[int], k: int) -> int:
cnt = defaultdict(int)
cnt[0] = 1
pre = ans = 0
for x in nums:
pre += x
ans += cnt[pre - k]
cnt[pre] += 1
return ansvar subarraySum = function(nums, k) {
const cnt = new Map();
cnt.set(0, 1);
let pre = 0, ans = 0;
for (const x of nums) {
pre += x;
ans += cnt.get(pre - k) || 0;
cnt.set(pre, (cnt.get(pre) || 0) + 1);
}
return ans;
};
Comments