https://leetcode.com/problems/subarray-sum-equals-k/
Input: nums = [1,1,1], k = 2
Output: 2
Input: nums = [1,2,3], k = 3
Output: 2
연속된 subarray들 중 합이 k인 경우의 수를 모두 찾아서 return 해준다.
cumulative(누적) sum different 개념을 활용한다.
cumulatuive sum diff가 무엇인가...
[ 6 3 2 5 3 -3 ] 에서 sum 10이 되는 sub array를 찾으라 해보자.
[6 9 11 16 19 16] 과 같이 더해간다.
해당 결과물을 hash map을 통해서 key값으로 값을 넣고, val값으로 index를 넣어준다.
그리고 두 값의 차이가 10이 되는 곳이 10되는 sub array이 일 것이다.
19 와 9 / 16 과 6 (2가지가 있다.)
시작 부분이 6, 끝 부분이 16이면, idx[3] - idx[0] 이 될 것이다. 따라서 [3, 2, 5] 가 된다.
그리고 edge case를 생각해야 하는데 [6, 3, 2] 도 10이 된다. 그렇기 때문에 처음 시작 부분이 될 edge case를 넣어줘야 한다. index -1 과 val 0을 넣어준다. hash map 에도 넣어준다.
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
std::unordered_map<int, int> umap;
umap[0] = 1; // edge case를 위해
int sum = 0;
int total = 0;
for (int i = 0; i < nums.size(); ++i)
{
sum += nums[i];
if (umap.find(sum - k) != umap.end()) // 2를 찾는다 하면 1 - 2 = -1. 없으니까 패스 (보기 1)
total += umap[sum - k];
if (umap.find(sum) != umap.end())
umap[sum]++;
else
umap[sum] = 1;
}
return total;
}
};
Runtime: 68 ms, faster than 94.87% of C++ online submissions for Subarray Sum Equals K.
Memory Usage: 36 MB, less than 97.06% of C++ online submissions for Subarray Sum Equals K.