[Leedcode][JAVA][第974题][和可被K整除的子数组][前缀和][HashSet]
生活随笔
收集整理的這篇文章主要介紹了
[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語言的原則是使商盡可能大,很多新型語言和網頁計算器的原則是使商盡可能小。
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]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程-----个人总结
- 下一篇: WEB开发常用软件集合