1. 程式人生 > 實用技巧 >560. 和為K的子陣列. 字首和

560. 和為K的子陣列. 字首和

給定一個整數陣列和一個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。

示例 1 :

輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。
說明 :

陣列的長度為 [1, 20,000]。
陣列中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

與https://www.cnblogs.com/xgbt/p/13463795.html 對比。

求連續子陣列且不要求非重疊,使用map,mp[sum]表示字首和為sum已出現的次數。
在記錄過程中若,對於當前sum,mp中若出現 sum - target 不為0,則ans += mp[sum - target]

class Solution {
public:
    int subarraySum(vector<int>& nums, int target) {
        unordered_map <int, int> mp;

        int ans = 0, sum = 0;

        mp[0] = 1;
        for (auto num : nums) {
            sum += num;
            if (mp.find(sum - target) != mp.end()) {
                ans += mp[sum - target];
            }
            mp[sum]++;
        }

        return ans;
    }
};