題目鏈結
字首和+雜湊
時間複雜度o(n)
。
在解決這道題前需要先清楚,乙個和為k
的子陣列即為一對字首和的差值【這句話摘自鏈結】
1.我們假設有這麼乙個子陣列[i,j]
滿足數字和為k
,那麼就有pre[j] - pre[i-1] = k
(注:pre陣列為記錄字首和的陣列),則pre[i-1] = pre[j] - k
;
2.題目問找到nums陣列中和為k的連續的子陣列的數目,一開始想到是否會重疊,後來仔細看題目後發現題目中並沒有限定子陣列是否重疊,那麼這道題只需要記錄pre[i-1]
出現的次數即可;
3.不過為什麼要累加pre[i-1]
出現的次數呢?
原因是我們要算出滿足以下標為j
為結尾的陣列的數字和為k
的出現的次數,由pre[i-1] = pre[j] - k
可知[i,j]
這個子陣列已經滿足數字和為k
,那麼首先需要想到的是應該把這一次記錄上,即+1
,不過由於在遍歷時我們每次都會把當前的字首和用乙個雜湊表儲存下來,並且累加1,這裡我們每次都累加1,也就是說在下標i
前面有可能存在乙個下標m
,滿足[m,j]
這個子陣列的數字和為k
,這樣就不難理解為什麼每次都需要累加pre[i-1]
的次數了.(注意這個pre[i-1]
的值是通過pre[j]-k
來得到的)
4.如果還沒理解為什麼要累加pre[i-1]
出現的次數,來張圖感受一下。
**上圖,假設我們已經知道oa
、ob
、oc
的長度均為s
,那麼我們可取距離c
點為k
的點d
,可知ad=bd=cd=k
,通過這個圖就很好理解為什麼要累加pre[j]-k
出現的次數了。
5.這道題當初做的時候理解錯題目了,原以為是求出連續的符合條件的子陣列,並且子陣列之間邊界恰好重疊。其實這道題說的是這個子陣列連續,也就是說這個子陣列它不間斷,否則沒有理解到這點就很難做對了。
class solution
hs[sum]++;
}return res;}};
leetcode 560 和為k的子陣列
給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數k的範圍是 1e7,1e7 解法1 暴力法 p...
LeetCode 560 和為K的子陣列
給定乙個整數陣列和乙個整數k,你需要找到該陣列中和為k的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數k的範圍是 1e7,1e7 解題思路 從前向後...
Leetcode 560 和為K的子陣列
560.和為k的子陣列 一開始用的窮舉,超時了 class solution def subarraysum self,nums list int k int int counter 0for i in range len nums sum 0 a i while a len nums 1 sum ...