1 题目:0974. 和可被 K 整除的子数组
官方标定难度:
给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的非空 子数组 的数目。
子数组 是数组中 连续 的部分。
示例 1:
输入:nums = [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]
示例 2:
输入: nums = [5], k = 9
输出: 0
提示:
1 < = n u m s . l e n g t h < = 3 ∗ 1 0 4 1 <= nums.length <= 3 * 10^4 1<=nums.length<=3∗104
− 104 < = n u m s [ i ] < = 1 0 4 -104 <= nums[i] <= 10^4 −104<=nums[i]<=104
2 < = k < = 1 0 4 2 <= k <= 10^4 2<=k<=104
2 solution
和第 0560 很类似,直接用前缀和,避免过多求和,用 hash 快速检索,保存 mod k 的结果即可,注意负数取余数的情况。
代码
class Solution {
public:int subarraysDivByK(vector<int> &nums, int k) {unordered_map<int, int> map;int sum = 0;int cnt = 0;for (int i = 0; i < nums.size(); i++) {sum = (sum + nums[i]) % k;sum = (sum + k) % k;cnt += map[sum];if (sum == 0) cnt++;map[sum]++;}return cnt;}
};