由于題目要求子數組必須連續,也就是需要一個和為K的區間,可以利用前綴和預處理后,枚舉找到這些區間段[l,r]
,使之滿足s[r] - s[l] = k
。
不理解前綴和的可以先看這里。
class Solution {
public:int subarraySum(vector<int>& nums, int k) {int s[nums.size() + 1];memset(s, 0, sizeof s);// 存儲前綴和,定義從1開始for(int i = 1;i <= nums.size();i ++) s[i] = nums[i - 1] + s[i - 1];unordered_map<int, int> mp; // 哈希表存下已經出現過的前綴和int cnt = 0;// 確保s[i] = k時,能統計這單個s[i]為1個子數組(s[i] - k = 0)mp[0] = 1;for(int i = 1;i <= nums.size();i ++){//前面已經出現過的s[i] - k的個數,正是和為 k 的子數組的個數//因為s[i](后) - (s[i] - k)(前) = kcnt += mp[s[i] - k];mp[s[i]] ++;}return cnt;}
};