LeetCode刷题系列 -- 974. 和可被 K 整除的子数组
创始人
2024-05-24 20:53:45
0

给定一个整数数组 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 <= nums.length <= 3 * 10^4

  • -10^4 <= nums[i] <= 10^4

  • 2 <= k <= 10^4

974. 和可被 K 整除的子数组 - 力扣(Leetcode)

思路:

定义前缀和数组 preSum,若是有子数组 nums[ i ], ..., nums[ j ] 的和为 k 的倍数,那么有
( preSum[ j ] - preSum[ i ] ) % k == 0, 即 preSum[ j ] % k == preSum[ i ]。
定义 map ,其中 key 为前缀和对k的取余,value 为 前缀和对 k 取余的次数。
有两个特殊情况需要考虑:
1. 负数取余 : ( v % k + k) %k
2. 当 preSum[ m ] 取余的结果为 0 时,证明子数组和 nums[ 0 ] + ... + nums[ m ] 为 k 的倍数

c++:

class Solution {
public:int subarraysDivByK(vector& nums, int k) {vector preSum(nums.size(), 0);map tarMap; // key 为前缀和对 k 的取余,value 为 这样的前缀和出现的次数int result = 0;tarMap[0] = 1;for(int i = 0; i < nums.size(); i++) {if(i == 0) {preSum[i] = nums[i];} else {preSum[i] = preSum[i-1] + nums[i];}int key = (preSum[i]%k+k) % k;if(tarMap.count(key)) {tarMap[key] += 1;} else {tarMap[key] = 1;}result += (tarMap[key] - 1);}return result;}
};

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...