SweepLine

起因

今天做了一道题,LeetCode 560. Subarray Sum Equals K,有点蒙蔽,看了答案发现比较简单,记录一下

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

1
2
3
4
5
6
7
8
示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :

数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

题解

题目的意思比较明确,要求找到 n 个连续的子数组,并且这些连续子数组的和为 k

  • 子数组求和
  • 子数组求和可以使用前缀和,那么如何知道它能够满足需求? 前缀和可以知道具体区间的和,那么区间终点的值 -k,就是这段区间的起点。
  • 需要一个哈希表,来记录上次出现该值得地方,找到 cur-k 就是找到了和位 k 的区间起点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int subArraySum(vector<int> &nums, int k) {
int ans = 0, pre = 0;
unordered_map<int, int> memo_;
memo_[0] = 1;
for (const auto &num : nums) {
pre += num;
if (memo_.find(pre - k) != memo_.end()) {
ans += memo_[pre - k];
}
memo_[pre]++;
}
return ans;
}
};
作者

shouyi.www

发布于

2020-09-22

更新于

2025-01-30

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×