From 9a805cb1d4e8031324ccbd9f2a72c7080c32f5b3 Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Sat, 2 May 2020 17:35:25 +0800 Subject: [PATCH] add 560. Subarray Sum Equals K :beer: --- README.md | 1 + solutions/560. Subarray Sum Equals K.md | 30 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 solutions/560. Subarray Sum Equals K.md diff --git a/README.md b/README.md index 8a24f74..f32f603 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,7 @@ My LeetCode solutions with Chinese explanation. 我的LeetCode中文题解。 | 509 |[Fibonacci Number](https://leetcode.com/problems/fibonacci-number/)|[C++](solutions/509.%20Fibonacci%20Number.md)|Easy| | | 532 |[K-diff Pairs in an Array](https://leetcode.com/problems/k-diff-pairs-in-an-array)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/532.%20K-diff%20Pairs%20in%20an%20Array.md)|Easy| | | 543 |[Diameter of Binary Tree](https://leetcode.com/problems/diameter-of-binary-tree/)|[C++](solutions/543.%20Diameter%20of%20Binary%20Tree.md)|Easy| | +| 560 |[Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/)|[C++](solutions/560.%20Subarray%20Sum%20Equals%20K.md)|Medium| | | 561 |[Array Partition I](https://leetcode.com/problems/array-partition-i)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/561.%20Array%20Partition%20I.md)|Easy| | | 566 |[Reshape the Matrix](https://leetcode.com/problems/reshape-the-matrix)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/566.%20Reshape%20the%20Matrix.md)|Easy| | | 572 |[Subtree of Another Tree](https://leetcode.com/problems/subtree-of-another-tree/)|[C++](solutions/572.%20Subtree%20of%20Another%20Tree.md)|Easy| | diff --git a/solutions/560. Subarray Sum Equals K.md b/solutions/560. Subarray Sum Equals K.md new file mode 100644 index 0000000..cb54e24 --- /dev/null +++ b/solutions/560. Subarray Sum Equals K.md @@ -0,0 +1,30 @@ +# [560. Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/) + +# 思路 + +求和为k的连续子数组的个数。因为要求连续子数组,所以我们可以先计算出前缀和`preSum`,然后就可以很方便计算任意区间对应的连续子数组的和`sum[i~j] = preSum[j]-preSum[i]`。要和为k,所以我们可以用一个二重循环遍历前缀和数组`preSum`,但是复杂度为O(n^2)。 + +更高效的做法是用一个hash表来记录所有前缀和与其出现次数的映射,这样假设当前位置的累加和为`cur_sum`,我们可以通过哈希表快速查找`cur_sum - k`出现的次数。注意hash表初始时要有一个0到1的映射。 + +时间复杂度O(n) + +# C++ +``` C++ +class Solution { +public: + int subarraySum(vector& nums, int k) { + unordered_mapmp; + mp[0] = 1; + + int cur_sum = 0, res = 0; + for(int i = 0; i < nums.size(); i++){ + cur_sum += nums[i]; + auto it = mp.find(cur_sum - k); + if(it != mp.end()) res += it -> second; + mp[cur_sum]++; + } + return res; + } +}; +``` +