力扣 560 和為K的子陣列

2022-04-09 13:46:19 字數 1262 閱讀 8390

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

輸入:nums = [1,1,1], k = 2

輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。

方法一、字首和(不優化)

定義pre[i]為[0..i]裡所有數的和,即字首和。you遞推關係得到:  

pre[i] = pre[i-1]+nums[i];

那有了字首和,我們就能很方便地表示[j..i]這個子陣列的和,時間複雜度為o(1),表示如下:

sum[j..i] = pre[i] - pre[i-1];

那想要找到滿足和為k的子陣列的個數,實際上就是求:

if(pre[i] - pre[j-1]==k)

我們可以列舉i,找到滿足pre[j] = pre[i]-k的j的個數即可,通過上述分析,我們可以得到下述**:

class

solution

else

}int res = 0;

for(int i=0; i<=len; i++) }}

return

res;

}}

方法

二、字首和+hashmap優化

從方法一,我們可以看到,每次列舉i後,我們都要遍歷i之前的j,看是否滿足:

pre[j] == pre[i] - k

所以我們可以考慮用map,(鍵,值)= (pre[i], 出現的次數)。在從左到右列舉i的過程中,同時更新hashmap,那麼以i結尾的答案hashmap[pre[i] - k],就能在o(1)的時間內得到,最後將列舉所有i的結果累加即可,產生最終的答案。

需要注意的是,從左往右計算hashmap[pre[i] - k],裡面記錄的pre[j]的下表範圍是0<=j<=i。又因為pre[i]的計算只與前一項的答案有關,因此就不用建立pre陣列,直接用pre變數記錄即可。**如下:

class

solution

hashmap.put(presum, hashmap.getordefault(presum, 0) + 1);

}return

ans;

}

560 和為K的子陣列 力扣

題意理解 給定乙個陣列,計算連續元素和等於k的個數。注意,元素可能為負,相應的連續和忽大忽小。問題分析 方法1 依次遍歷元素,依次遍歷每個元素所有可能連續和是否k。方法2 連續和看成是從元素0開始的兩個連續和的差值。問題轉化為遍歷每個連續和,如果存在這個連續和 k差值的連續和,那麼存在乙個等於k的連...

力扣 560 和為K的子陣列 雜湊

給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數 k 的範圍是 1e7,1e7 class soluti...

560 和為K的子陣列

題解 1.維護乙個unordered map 字首陣列和,count 2.遍歷陣列的累加和,如果存在sum k,在 unordered map裡面,則有count種情況 複雜度分析 解題思路 一 建立map表用於儲存每個連續子陣列sum求和出現的次數,初始化為 0,1 表示和為0的連續子陣列出現1次...