題目:
給定乙個整數陣列 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 ...