LeetCode每日一題5月15日 LeetCode560,和爲k的子數組

問題描述:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k

示例 1 :

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

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


解題思路:

建立map表用於存儲每個連續子數組sum求和出現的次數,初始化爲(0,1),表示和爲0的連續子數組出現1次。

sum的值是在對nums數組的循環中不斷累加當前元素的,res的值則需要查找map中是否已存在sum-k的元素,也就是在查找此前所有從0項開始累加的連續子項和中有沒有sum-k。

如果有的話,則說明從該項到當前項的連續子數組和必定爲k,那麼res則可以和這個sum的對應值,即這個sum出現的次數,相加得到新的res。

對於當前sum如果已存在與map中則其對應值+1,不存在則添加新項,初始值爲1。

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        if(nums.size()==0){
            return 0;
        }
        map<int,int> table;
        table[0] = 1;
        int res = 0;
        int sum=0;
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
            res+=table[sum-k];
            table[sum]++;
        }
        return res;
    }
};

 

 

 

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