974. 和可被 K 整除的子數組(C++)---哈希表解題

題目詳情
給定一個整數數組 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

——題目難度:中等


 




思路

涉及連續子數組問題的話,可以把每次求和的結果記錄下來,這樣可以減少運算次數。

設P[i] = A[0] + A[1] + ... + A[i],則(p[j] - p[i-1])表示下標爲j的元素到下標爲i的元素的元素和(j>=i>=1),
(p[j] - p[i-1]) mod K = 0 的話,就說明從下標從j到i的元素和滿足被K整除
又根據同餘定理,有P[j] mod K = p[i-1] mod K,說明如果下標j的元素和跟K的取模只要 和 下標從i的元素和跟K的取模 數值相同,則滿足條件。
應用上式時特別需要注意:當如[-3,4,2], K=4的這些情況,也就是處理被除數是負數時,需要對餘數進行特殊處理(因爲要運用上式),所以運用modulus = (sum % K + K) % K這個表達式可以同時處理被除數是正數或者負數的餘數。



-代碼如下
 

class Solution {
public:
    int subarraysDivByK(vector<int>& A, int K) {
		unordered_map<int, int> record = {{0, 1}};
		int sum = 0, modulus,ans = 0;
		
        /*計算同餘出現的次數 和 統計滿足條件的個數*/
		for(auto num: A)
		{
			sum += num;
			/*下面式子的目的是: 當被除數sum是負數的時候,也可以進行處理*/ 
			modulus = (sum % K + K) % K;
			if(record[modulus]) {
				ans += record[modulus];
			}
			
			record[modulus]++;
		}
		
		return ans;
    }
};

 

 

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