[LeetCode] 974. Subarray Sums Divisible by K

Given an integer array nums and an integer k, return the number of non-empty subarrays that have a sum divisible by k.

A subarray is a contiguous part of an array.

Example 1:

Input: nums = [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]

Example 2:

Input: nums = [5], k = 9
Output: 0

Constraints:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • 2 <= k <= 104

和可被 K 整除的子数组。

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subarray-sums-divisible-by-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 }

 

相关题目

523. Continuous Subarray Sum

974. Subarray Sums Divisible by K

前缀和prefix sum题目总结

LeetCode 题目总结

posted @ 2020-05-27 01:09  CNoodle  阅读(209)  评论(0编辑  收藏  举报