不说废话,直接刷题。用前缀和加上哈希表,时间复杂度可以控制在 O(N)O(N)O(N).哈希表是用 O(1)O(1)O(1) 的时间做到查询。哈希表和字典差不多,或者和直接搜索差不多,但是效率非常快,就是常数时间就可以查找成功。keykeykey 是前缀和,valuevaluevalue 是该前缀和出现的次数。
preSum[j−1]=preSum[i]−kpreSum[j-1]=preSum[i]-kpreSum[j−1]=preSum[i]−k
我们就是查询 preSum[j−1]preSum[j-1]preSum[j−1] 是否存在,如果存在,我们就把这个答案累加到计数器里面。
cpp
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1;
int preSum = 0;
int count = 0;
for ( auto& num: nums ) {
preSum += num;
if ( mp.find( preSum - k ) != mp.end() ) {
count += mp[ preSum - k ];
}
mp[preSum]++;
}
return count;
}
};