Leetcode--Java--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. 前缀和 + 哈希表。 思路类似下面这题
    Leetcode–Java–930. 和相同的二元子数组
    不过本题存储的是余数。推理如下:
    Leetcode--Java--974. 和可被 K 整除的子数组_第1张图片
    只需要判断当前加入的余数是否在map中已经存在,若存在,就存在这样的一段区间能够被K整除
  2. 记得将取余结果转化成正数,方法为:
    (sum % k + k ) % k

代码

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
      if (nums.length == 0){
          return 0;
      }
      int res = 0, sum = 0;
      Map<Integer, Integer> map = new HashMap<>();
      map.put(0, 1);
      for (int x: nums){
          sum += x;
          //保证取模的结果是正数
        int key = (sum % k + k) % k;
        //如果map中含有相同的余数,则说明可以被整除
        if (map.containsKey(key)){
            res += map.get(key);
        }
        //把余数存入map
        map.put(key, map.getOrDefault(key, 0) + 1);
      }
      return res;
    }
}

你可能感兴趣的:(Leetcode,前缀和,数组,哈希表,取模,转化为正数)