leetcode和可被 K 整除的子陣列

2021-10-06 13:30:31 字數 1740 閱讀 4654

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