和可被K整除的子陣列

2021-10-06 13:49:14 字數 1148 閱讀 2593

給定乙個整數陣列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] <= 100002 <= k <= 10000
思路:

這道題剛接到手

不用想肯定是用字首和

題目都說了嘛,子陣列元素之和

我們可以先獲取字首和的陣列,比如[4,5,0,-2,-3,1]

字首和陣列:[0,4,9,9,7,4,5]

陣列第乙個必定是0,不然不好算第乙個元素的字首和

現在問題變成了,presum[j+1]-presum[i]能被k整除,陣列範圍是[i…j]

那麼能被k整除,就說明兩個字首和求餘k是相等的

由:(presum[j+1]-presum[i])%k=0

得:presum[j+1]%k-presum[i]%k=0

得:presum[j+1]%k=presum[i]%k

對上述字首和求餘

得到:[2,0,1,0,4]

其中2代表[0,5]是求余為0的個數

1代表[7]求余為2的個數

4代表[4,9,9,4]求余為4的個數

陣列下標就是餘數,元素就是求餘相同的個數

特別注意:取余是負數時,需要加上k,因為陣列下標不能是負數

那麼如何求被k整除的子陣列的個數呢?

比如,餘數為4的字首和有4個

那麼我們只需要求它們的排列組合就行了,即:4*(4-1)/2

**://字首和

public int subarraysdivbyk(int a, int k) {

int res=0;

int presum=new int[a.length+1];

presum[0]=0;

//計算字首和

for(int i=1;i複雜度:

時間複雜度:o(n)

空間複雜度:o(n+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 如果sum1 k n,sum2 k...

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...

leetcode和可被 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 在開始分析之前,我們先假定乙...