560. HASH 解法 和爲K的子數組

560. 和爲K的子數組

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

示例 1 :

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

說明 :

  1. 數組的長度爲 [1, 20,000]。
  2. 數組中元素的範圍是 [-1000, 1000] ,且整數 的範圍是 [-1e7, 1e7]。
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map <int ,int> hash;//在這裏的思想爲: 我們假設一個區間
        int result =0;
        int s =0;
        hash[0] =1;//這裏設置爲 1 的原因是,如果輸入爲 [3,-3], K=0;
        //  那麼就需要我們設置 hash[0] =1; 這個初始值了
        for(auto x:nums){
           s +=x;
           if(hash.find(s-k) != hash.end()){
               result += hash[s-k];//把前面 hash[s-k] 的次數累加起來
           }
           hash[s] ++;
        }
        return result; //返回來結果
    }
};


/*假如存在區間[left,right],使得在[left,right]這個區間的子數組的和爲k。換句話說,就是前right項和減去前left項和等於k,即前left項和等於前right項和減去k。
可以這樣做,在掃描數組的同時,假設當前掃到第i位,記錄它的前i項和sum,用該和減去k,即sum-k,判斷sum-k是否爲某個位置的前n項和,若是,更新統計量。

作者:jarvis1890
鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/qian-zhui-he-shi-xian-jian-dan-by-jarvis1890/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

*/
// 加油加油。Try to make yourself more excellent

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章