給定乙個整數陣列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 在開始分析之前,我們先假定乙...