字首和 雜湊用法總結

2021-10-06 14:06:16 字數 2297 閱讀 9775

思路:遇到這種連續子陣列的問題,通常有的方法:

1.【leetcode560】和為k的子陣列

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

示例 1 :

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

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

說明 :

陣列的長度為 [1, 20,000]。

陣列中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。

思路:字首和根本思路在於推導presum[j] - presum[i - 1] = sum(i, j),如果presum[j] - presum[i - 1]=k,那麼presum在生成的過程中,利用雜湊表查詢是否存在presum-k的元素存在,記錄presum-k存在的次數即為和presum組合的子陣列的個數;還要注意邊界即乙個元素也需要記錄個數。

class solution:

def subarraysum(self, nums: list[int], k: int) -> int:

hashmap =

presum = 0

res = 0

for i in range(len(nums)):

presum += nums[i]

if presum - k in hashmap:

res += hashmap[presum - k]

hashmap[presum] = hashmap.get(presum, 0) + 1

return res

2.【leetcode974】和可被 k 整除的子陣列

給定乙個整數陣列 a,返回其中元素之和可被 k 整除的(連續、非空)子陣列的數目。

示例:輸入:a = [4,5,0,-2,-3,1], k = 5

輸出:7

解釋:有 7 個子陣列滿足其元素之和可被 k = 5 整除:

[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

思路:推導過程presum[j] - presum[i - 1] = sum(i, j),若數字a和b分別除以數字c,若得到的餘數相同,那麼(a-b)必定能夠整除c,這裡雜湊表儲存的是餘數。

class solution:

def subarraysdivbyk(self, a: list[int], k: int) -> int:

presum = 0

res = 0

a = 0

hashmap =

for i in range(len(a)):

a += a[i]

presum = a % k

if presum in hashmap:

res += hashmap[presum]

hashmap[presum] = hashmap.get(presum, 0) + 1

return res

3.【leetcode523】

思路:這個雜湊的鍵值是餘數和索引值,注意初始情況,k==0的情況

class solution:

def checksubarraysum(self, nums: list[int], k: int) -> bool:

#注意:1.k == 0;2.至少包括兩個數i - hashmap[presum] > 1;3.使用if presum in hashmap:而不是hashmap.get(presum)

res = false

if len(nums) == 0:

return res

hashmap =

presum = 0

a = 0

for i in range(len(nums)):

a += nums[i]

presum = a % k if k != 0 else a

# print(hashmap.get(presum))存索引時不要這樣,因為可能下標為0這樣就跑到else那裡去了

if presum in hashmap:

# print(i, hashmap[presum])

if i - hashmap[presum] > 1:

res = true

else:

hashmap[presum] = i

# print(hashmap)

return res

字首和與雜湊表

字首和解法 class solution return count 另解 class solution return flag 雜湊表與unordered map class solution return count unordered map可以看作讀取更快的陣列 number x 的值為num...

leetcode560題解 字首和 雜湊

題目鏈結 字首和 雜湊 時間複雜度o n 在解決這道題前需要先清楚,乙個和為k的子陣列即為一對字首和的差值 這句話摘自鏈結 1.我們假設有這麼乙個子陣列 i,j 滿足數字和為k,那麼就有pre j pre i 1 k 注 pre陣列為記錄字首和的陣列 則pre i 1 pre j k 2.題目問找到...

字首和 差分總結

差分問題總結 一維例題 輸入乙個長度為n的整數序列。接下來輸入m個操作,每個操作包含三個整數l,r,c,表示將序列中 l,r 之間的每個數加上c。請你輸出進行完所有操作後的序列。設那麼求a陣列時,就可以利用b陣列的字首和來計算 在a2 a4區間內每個數加x,就相當於b2加上2,而b3不變,b4也不變...