給定乙個整數陣列 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 力扣上的題目,看了幾個小時看...