560. 和为K的子数组 974. 和可被 K 整除的子数组 (哈希表)
引言
這兩道題非常相似,也是對哈希表運用的考察,兩道題合到一起總結一下
560. 和為K的子數組
給定一個整數數組和一個整數 k,你需要找到該數組中和為 k 的連續的子數組的個數。
示例 1 :
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。
說明 :
數組的長度為 [1, 20,000]。
數組中元素的范圍是 [-1000, 1000] ,且整數 k 的范圍是 [-1e7, 1e7]。
這道題就是通過逐一統計數組前綴和再通過哈希表的查找來確定所有子數組個數;
這里只需要注意一點就是,前綴和本身就是k的時候需要初始化為1,就這一種情況;
注釋在代碼里,就不寫詳細題解了,代碼如下:
class Solution { public:int subarraySum(vector<int>& nums, int k) {//key為前綴和,value為該和出現的次數unordered_map<int, int> hash;//前綴和為0的時候出現次數為一次hash[0] = 1;//如果存在pre[i] = pre[i - 1] + k;那么就可以在map里找是否存在pre[i] - k,//即map中是否存在pre[i - 1]來確定子數組個數int pre = 0, ans = 0;for (int i : nums) {pre += i;if (hash.find(pre - k) != hash.end()) {ans += hash[pre - k];}hash[pre]++;}return ans;} };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 <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000
這一道幾乎一模一樣,方法都一樣,無非就是上一道題的哈希表key值是差,這一道題變成模就可以了;
同樣注意初始化,當前綴和本身被 k 整除時初始化為1即可;
額外注意一點,c++取模時如果被除數為負數時取模結果也為負數,所以為了方便運算這里需要一個轉化,將結果轉化為正數;
代碼如下:
class Solution { public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int, int> hash;hash[0] = 1;int ans = 0, pre = 0;for (int i : nums) {pre += i;//當被除數為負數時取模結果為負數,需要改為正數int mod = (pre % k + k) % k;if (hash[mod]) {ans += hash[mod];}hash[mod]++;}return ans;} };這兩道還是需要能夠想到哈希表該怎么來用,這也是解題的關鍵;
總結
以上是生活随笔為你收集整理的560. 和为K的子数组 974. 和可被 K 整除的子数组 (哈希表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 347. 前 K 个高频元素(哈希表)
- 下一篇: 134. 加油站(贪心算法)