zoukankan      html  css  js  c++  java
  • [LeetCode] 974. Subarray Sums Divisible by K

    Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum divisible by K.

    Example 1:

    Input: A = [4,5,0,-2,-3,1], K = 5
    Output: 7
    Explanation: There are 7 subarrays with a sum divisible by K = 5:
    [4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
    

    Note:

    1. 1 <= A.length <= 30000
    2. -10000 <= A[i] <= 10000
    3. 2 <= K <= 10000

    和可被 K 整除的子数组。题意跟560题很接近,唯一不同的地方在于这个题找的是可以被K整除的子数组,需要判断前缀和是否能%K。依然是前缀和的思路做,需要注意的是当前缀和为负数的时候,需要将其不断加K使其变成正数之后再放入hashmap,否则结果就是错的。举个例子,如果前缀和是-1,K = 5的话,需要将前缀和 + 5 = 4,这样余数是4而不是-1。根据同余定理得知,当某两个前缀和%K的结果相同的时候,他们之间的子数组的和就一定能被K整除。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int subarraysDivByK(int[] A, int K) {
     3         int res = 0;
     4         int sum = 0;
     5         Map<Integer, Integer> map = new HashMap<>();
     6         map.put(0, 1);
     7         for (int a : A) {
     8             sum = (sum + a) % K;
     9             if (sum < 0) {
    10                 sum += K;
    11             }
    12             res += map.getOrDefault(sum, 0);
    13             map.put(sum, map.getOrDefault(sum, 0) + 1);
    14         }
    15         return res;
    16     }
    17 }

    前缀和prefix sum题目总结

    LeetCode 题目总结

  • 相关阅读:
    mangoDB
    python文档
    单例模式
    celery
    flask 部署
    json
    Docker+Jenkins+Go完成自动化部署
    Go多协程循环打印ABAC
    正则表达式
    从零开始学Go之并发(四):互斥
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12970033.html
Copyright © 2011-2022 走看看