LeetCode 560. 和為K的子陣列(字首和+雜湊+問題轉化)

抓水母的派大星發表於2024-03-17

思路

  1. 把問題轉化成 求任意兩個字首和A和字首和B的差 = K

  2. 用雜湊表unordered_map存:每一個字首和的出現次數

  3. 比如說 字首和A已經存在了雜湊表中,且A出現過兩次,那麼現在走到字首和B的位置,一旦B-K的值在雜湊表裡出現過,說明有這個子陣列存在,且個數是雜湊表對應的value值

額外測試資料

題目給的資料不是很好推過程

測試資料:3 4 5 2 -3 1 4 2 k=7 -> ans=4

注意k=0的資料

  • nums=1 k=0 -> 0

  • nums=-1,-1,1 k=0 ->1

AC程式碼

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int sum[20010];
        memset(sum,0,sizeof(sum));
        
        unordered_map<int,int>mp; // 底層雜湊表 ,記錄出現次數而不是是否出現過
        int ans=0;
        mp[0]=1; // *** 一定要加上!
        for(int i=0;i<nums.size();i++) // i是索引
        // for(auto &i:nums) // i是值,不是索引! 索引需要額外開一個變數index記錄
        {
            if(i==0) // 初始化
                sum[0]=nums[i];
            else
                sum[i]=sum[i-1]+nums[i];
            if(mp[sum[i]-k]) ans+=mp[sum[i]-k];
            mp[sum[i]]++; // 上一步判斷完再標記!否則 1 k=0會輸出1而不是正確答案0
        }

        return ans;
    }
};

相關文章