給定乙個整數陣列 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]
在開始分析之前,我們先假定乙個陣列變數pre_sum用來儲存輸入陣列a的前n項和,例如pre_sum[0]表示a[0], pre_sum[1] 表示a[0]+a[1]…依次類推。那麼接下來,我們就以a=[4, 5, 0, -2, -3, 1], k=5為例,可以得到如下**:
index01
2345
a450
-2-3
1pre_sum49
9745
pre_sum%k44
4340
可以看到pre_sum中一些元素對k求模得到了相同的值,我們要知道當兩個數a, b除以同乙個數c得到相同的餘數時,那麼a和b之差一定可以被c整除,例如:
5 % 3 = 2, 11 % 3 = 2, 11 - 5 = 6 , 6 % 3 = 0.
我們再回到我們的表中, pre_sum[0] % k = 4, pre_sum[1] % k = 4, 所以pre_sum[1]-pre_sum[0]即a[1]可以被k整除,同理pre_sum[2]-pre_sum[0]即sum([a[1], a[2]])可以被k整除,pre_sum[2]-pre_sum[1]即a[2]可以被k整除,這實際上就是乙個排列組合問題,相當於從n個數中抽出兩個數有多少種可能,即c(n, 2),在這個樣例中,4一共出現4次,所以求得c(4, 2) = 6, 我們會發現這和標準答案不符啊,標準答案應該是7才對啊,我們不要忘了,pre_sum[5]%k=0的情況,即便0只出現了一次,它依然算作一種情況
明白這一點之後,接下來我們要做的就是找出pre_sum%k中每乙個數出現的次數,然後構造乙個排列組合
class
solution
(object):
defsubarraysdivbyk
(self, a, k)
: result =
0# 用來記錄最終的結果
length =
len(a)
pre_sum =
# 利用字典來記錄每乙個餘數出現的次數,其中餘數為鍵,它出現的次數為值
curr_sum =
0# 構造字典pre_sum
for i in
range
(length)
: curr_sum += a[i]
# 每次迴圈curr_sum就等於陣列a的前i項和
key = curr_sum % k
pre_sum[key]
= pre_sum.get(key,0)
+1for key in pre_sum.keys():
value = pre_sum[key]
if key ==0:
# 鍵值為0,即餘數為0
result += value
if value >1:
# 餘數出現次數大於1
n =(value *
(value -1)
)/2 result += n
return result
Leetcode刷題 947和可被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 1 a.length ...
和可被 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 如果sum1 k n,sum2 k...
和可被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 1 a.length 30000...