1. 程式人生 > 其它 >力扣刷題筆記13:雜湊表+字首和經典題目

力扣刷題筆記13:雜湊表+字首和經典題目

1.連續的子陣列和

解題思路:我們可以發現如果sum[i]%k==sum[j]%k(sum[i],sum[j]分別表示陣列中前i個和前j個元素之和),則i到j之間的元素之和必是k的倍數,我們只需判斷j-i是否大於等於2即可

我們卻可以建立一個雜湊表,key來儲存當前字首和的餘數,value則儲存對應的index,如果雜湊表中存在其對應的餘數,取出其pos,看當前的下標 index到 pos的距離是否大於等於2. 如果是則返回true。不是我們則繼續遍歷。不要更新雜湊表中的下標!(貪心的思維)如果不存在則將當前餘數與其對應的下標儲存在雜湊表中。

核心:當兩個不同位置的字首和對 k的取餘相同時,我們看這兩個位置的下標是否距離大於等於2. 如果滿足以上條件,我們即找到了一個連續陣列的和是 k的倍數。

具體程式碼如下:

2.和為k的子陣列

解題思路:

建立map表s用於儲存每個連續子陣列sum求和出現的次數,初始化為(0,1),表示和為0的連續子陣列出現1次。sum的值是在對nums陣列的迴圈中不斷累加當前元素的,res的值則需要查詢map中是否已存在sum-k的元素,也就是在查詢此前所有從0項開始累加的連續子項和中有沒有sum-k。如果有的話,則說明從該項到當前項的連續子陣列和必定為k,那麼res則可以和s[sum-k]相加得到新的res,並使s[sum-k]++

具體程式碼如下:

3.和可被k整除的子陣列

解題思路:這道題是第一題和第二題的結合,我們同樣需要建立map表s用於儲存每個連續子陣列sum%k的值求和出現的次數,初始化為(0,1),表示餘數為0的連續子陣列出現1次res的值則需要查詢map中是否已存在sum%k的元素,也就是在查詢此前所有從0項開始累加的連續子項和中有沒有sum%k。如果有的話,則說明從該項到當前項的連續子陣列和必定為k的倍數,那麼res則可以和s[sum%k]相加得到新的res,並且使s[sum%k]++;

具體程式碼如下:

4.連續陣列

解題思路:這道題也是一道典型的字首和問題,我們可以把nums陣列中的0全部變為-1,那麼這道題就變成了和為0的最長連續子陣列。剩下的過程和第二題類似,不同的是此時我們的s儲存的是sum的值和當前下標,並且如果s.count(sum)!=0我們不需要更新s[sum]的值。

具體程式碼如下: