日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第974题][和可被K整除的子数组][前缀和][HashSet]

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第974题][和可被K整除的子数组][前缀和][HashSet] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[中等]

給定一個整數數組 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. 暴力(不通過)

時間復雜度:O(N^2) 空間復雜度:O(1)

public int subarraysDivByK(int[] A, int K) {int n = A.length;int res = 0;for (int i = 0; i < n; ++i) {int sum = 0;for (int j = i; j < n; ++j) {if ((sum += A[j]) % K == 0) {++res;}}}return res;}
2. 前綴和 同余思想

轉化為同余的思想

時間復雜度:O(N) 空間復雜度:O(N)

數組維護

// 計算同余法// 用sum保存前n個數之和// 計算每個sum的余數,保存// 余數相同則可以整除 , 如// A = [4,5,0,-2,-3,1], K = 5// p[0] = 4, p[1] = 9, p[2] = 9, p[3] = 7, p[4] = 4, p[5] = 5// 余數對應 4,4,4,2,4,0;// 余數4有4個,排列組合法,計算4*3/2 = 6// 0余數相當于整除,用排列組合法(初始0賦值1), 2*1/2 = 1;// 最終答案為7public int subarraysDivByK(int[] A, int K) {int res = 0;// 記錄當前前綴和int preSum = 0;// 因為K固定,因此可以使用數組代替哈希表(mod[i] = j,代表余數為i的前綴和出現了j次)int[] mod = new int[K];// 余數為0的狀況,也就是直接被整除的情況,要提前放個1,考慮比如 A = {K}mod[0] = 1;for (int value : A) {// 更新前綴和preSum += value;// 計算mod(java注意)int m = (preSum % K + K) % K;// 更新結果res += mod[m];// 更新余數集記錄++mod[m];}return res;}

HashSet

class Solution {public int subarraysDivByK(int[] A, int K) {Map<Integer, Integer> record = new HashMap<>();record.put(0, 1);int sum = 0, ans = 0;for (int elem: A) {sum += elem;// 注意 Java 取模的特殊性,當被除數為負數時取模結果為負數,需要糾正int modulus = (sum % K + K) % K;int same = record.getOrDefault(modulus, 0);ans += same;record.put(modulus, same + 1);}return ans;} }

【總結】

1.取余問題
  • 對于任何同號的兩個整數,其取余結果沒有爭議,所有語言的運算原則都是使商盡可能小。
  • 對于異號的兩個整數,C++/Java語言的原則是使商盡可能大,很多新型語言和網頁計算器的原則是使商盡可能小。
//被除數是負數 C++(G++ 編譯): cout << (-7) % 3; // 輸出 -1Java(1.6): System.out.println((-7) % 3); // 輸出 -1Python 2.6:>>> (-7) % 3 // 輸出 2百度計算器:(-7) mod 3 = 2Google 計算器:(-7) mod 3 = 2 //除數是負數 C++(G++ 編譯): cout << 7 % (-3); // 輸出 1Java(1.6): System.out.println(7 % (-3)); // 輸出 1Python 2.6:>>> 輸出 -2百度計算器:7 mod (-3) = -2Google 計算器: 7 mod (-3) = -2】//被除數和除數同為負號 C++(G++ 編譯): cout << (-7) % (-3); // 輸出 -1Java(1.6): System.out.println((-7) % (-3)); // 輸出 -1Python 2.6:>>> 輸出 -1百度計算器:-7 mod (-3) = -1Google 計算器: -7 mod (-3) = -1
2. 前綴和 涉及到數組求和
3.數學是個好東西

轉載鏈接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k/solution/guan-fang-ti-jie-tong-yu-fa-by-qi-xi-5/

參考鏈接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k/solution/he-ke-bei-k-zheng-chu-de-zi-shu-zu-by-leetcode-sol/
參考鏈接:http://ceeji.net/blog/mod-in-real/

總結

以上是生活随笔為你收集整理的[Leedcode][JAVA][第974题][和可被K整除的子数组][前缀和][HashSet]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。