Leecode 974 和可被 K 整除的子陣列

2021-10-06 13:28:23 字數 1028 閱讀 8669

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

public

intsubarraysdivbyk

(int

a,int k)

return ans;

}

令 p[i] = a[0] + a[1] + … + a[i]p[i]=a[0]+a[1]+…+a[i]。

那麼每個連續子陣列的和 sum(i,j) 就可以寫成 p[j] - p[i-1]p[j]−p[i−1](其中 0 < i < j )的形式。

此時,判斷子陣列的和能否被 kk 整除就等價於判斷 (p[j] - p[i-1]) mod k == 0

根據 同餘定理,只要 p[j] mod k==p[i−1] mod k,就可以保證上面的等式成立。

因此我們可以考慮對陣列進行遍歷,在遍歷同時統計答案。

當我們遍歷到第 i 個元素時,我們統計以 i 結尾的符合條件的子陣列個數。

我們可以維護乙個以字首和模 k的值為鍵,出現次數為值的雜湊表record,在遍歷的同時進行更新。

這樣在計算以 i結尾的符合條件的子陣列個數時,根據上面的分析,

答案即為 [0…i−1] 中字首和模 k 也為 p[i] mod k 的位置個數,即 record [p[i] mod k]。

同時也不要忘記一種特殊性,就是a中某個元素就等於k,那麼mod k == 0,

所以需要在map中事先新增乙個0,即

map.

put(0,

1)

974 和可被 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 300...

974 和可被 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 300...

974 和可被 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 力扣上的題目,看了幾個小時看...