560 和為K的子陣列

2021-10-04 16:15:55 字數 1088 閱讀 3663

題解:1.維護乙個unordered_map《字首陣列和,count>

2.遍歷陣列的累加和,如果存在sum-k,在

unordered_map裡面,則有count種情況

複雜度分析

解題思路:

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

1.sum的值是在對nums陣列的迴圈中不斷累加當前元素的,res的值則需要查詢map中是否已存在sum-k的元素,也就是在查詢此前所有從0項開始累加的連續子項和中有沒有sum-k。

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

2.對於當前sum如果已存在與map中則其對應值+1,不存在則新增新項,初始值為1。

二、這個問題可以通過prefix sum來求解。假設我們令p[i] = a[0] + a[1] + ... + a[i-1]和p[j] = a[0] + a[1] + ... + a[j-1],那麼p[j] - p[i] = a[i] + a[i+1] + ... + a[j-1]。如果p[j] - p[i] == s的話,那麼[i,j]就是我們需要的區間。所以我們對於每個j,我們只要計算有多少個i使得p[j] - p[i] == s,這樣我們就得到了以p[j]作為右區間並且和為s的區間數。對於a中的每個元素都做同樣的處理,最有將所有的結果相加即可。

具體實現上,我們通過hash_map記錄p[j]。初始化的時候要注意乙個細節,對於dict[0]=1。為什麼?因為當p[j]==s時,p[i]=0並且此時我們的result=1。

class solution 

// 更新prefix_sum

const auto& ite = prefix_sum.find(sum);

if (ite != prefix_sum.end()) else

}return count;}};

560 和為K的子陣列

給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。求的是sum i,j k的個數。這個式子可以進行一些分解 分解1 sum i,j sum i,j 1 nums j 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 clas...

560 和為K的子陣列

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