Leetcode刷題 947和可被K整除的子陣列

2021-10-06 14:49:54 字數 1923 閱讀 9223

題目:

給定乙個整數陣列 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]

1 <= a.length <= 30000

-10000 <= a[i] <= 10000

2 <= k <= 10000

法一:暴力演算法,遍歷每個組合,算出每個組合的和是否能被k整除

class

solution

(object):

defsubarraysdivbyk

(self, a, k)

:"""

:type a: list[int]

:type k: int

:rtype: int

"""res =

0for i in

range

(len

(a))

:sum

= a[i]

res +=1if

sum% k ==

0else

0for j in

range

(i+1

,len

(a))

:sum

+= a[j]

res +=1if

sum% k ==

0else

0return res

if __name__ ==

'__main__'

: s = solution(

) re = s.subarraysdivbyk([4

,5,0

,-2,

-3,1

],5)

print

(re)

法二:同餘演算法

同餘定理:

若整數a和整數b除以正整數m的餘數相等,則稱a,b模m同餘

我們可以知道,假設ai,若count_mod_j - count_mod_i=0,那麼從a[i]到a[j]這子陣列必然能被k整除

class

solution

(object):

defsubarraysdivbyk

(self, a, k)

:"""

:type a: list[int]

:type k: int

:rtype: int

"""dic =

#初始化乙個字典

for i in

range

(k):

dic[i]=1

if i ==

0else

0for i in

range(1

,len

(a))

: a[i]

+= a[i-1]

for a in a:

dic[a%k]+=1

return

sum(v*

(v-1)//

2for v in dic.values(

))

為啥字典初始化時是dic?

如果只有乙個字首和的餘數是0那說明他也可以作為乙個結果,這是與其它mod k不一樣的,其它的需要兩個才能算作乙個結果,所以需要提前給0賦1,如果我們不提前給0賦1,那麼當v是1的時候,也就是字首和中只有乙個數mod k是0的話,組合個數v*(v-1)//2結果是0,但我們是希望mod k為0是可以直接算作乙個結果的,不然字首和中只有兩個mod k是0的時候才能算作乙個,與題意不符。

leetcode刷題(65) 494 目標和

給定乙個非負整數陣列,a1,a2,an,和乙個目標數,s。現在你有兩個符號 和 對於陣列中的任意乙個整數,你都可以從 或 中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。示例 1 輸入 nums 1,1,1,1,1 s 3 輸出 5 解釋 1 1 1 1 1 3 ...

開始刷題LeetCode

今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...

leetcode刷題歷程

難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...