leetcode.974 和可被 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. 1 <= A.length <= 30000
  2. -10000 <= A[i] <= 10000
  3. 2 <= K <= 10000

因爲是求子數組的和

可以用前綴和相減得到

設置數組s[], 就是前綴和

然後兩個前綴的差能被k整除,那他們兩mod K的餘數也肯定相同

設置數組c[k]

就是c[i] 就是s中mod K 爲i的個數

最後按照排列組合的原理

求所有Ci2的和

舉例 對於A= [4,5,0,-2,-3,1] K = 5,

s = [0, 4, 9, 9, 7, 4, 5] ,

c = [2, 0, 1, 0, 4] 代表有s中有兩個元素的餘數都爲0(即0和5),1個元素的餘數爲2(即7),四個元素的餘數爲4(即4994)

所以在保證餘數相同的情況下,取出兩個數都可以得到一組答案。對於這個例子答案就是 C22 + C12 + C42 = 1 + 0 + 6 = 7

#include <iostream>
#include <vector>

using namespace std;


int subarraysDivByK(vector<int>& A, int K) {
	const int len = A.size();
	const int k = K;
	int i;
	int s[30002] = {0};
	int c[10001] = {0};
	int sum = 0;

	
	for(i = 0; i < len; i++){
		s[i + 1] = s[i] + A[i];
	}

	for(i = 0; i <= len; i++){
		c[s[i] % K]++;
	}

	for(i = 0; i < k; i++){
		sum = sum + ((c[i] * (c[i] - 1)) / 2);
	}

	return sum;

}

int main(){
	int a[] = { -2 };
	vector<int> A(a, a + 1);

	int re = subarraysDivByK(A, 6);
	cout << re << endl;



}






 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章