leetcode 974. 和可被 K 整除的子数组(优质解法)

代码:
 

class Solution {public int subarraysDivByK(int[] nums, int k) {HashMap<Integer,Integer> hashMap=new HashMap();hashMap.put(0,1);int count=0;    //记录子数组的个数int last=0; //前一个下标的前缀和int now=0;  //当前下标的前缀和for(int i=0;i<nums.length;i++){now=last+nums[i];int r=(now%k+k)%k;count+=hashMap.getOrDefault(r,0);hashMap.put(r,hashMap.getOrDefault(r,0)+1);last=now;}return count;}
}

题解:

        涉及到子数组的问题,我们一般采用滑动窗口或者前缀和来解决,滑动窗口适合解决数组中只有正数的题,而前缀和适合解决关于子数组之和的题,本题要判断哪些子数组的和能够被 k 整除,所以适合使用前缀和来解决

        在解题之前,我们要先说明一个定理:同余定理,当(a - b)% c = n (整数) ,就能够推出 a % c = b % c ,这个定理是我们解题的要点,通过下图来说明解题的过程:

        sum 是前缀和数组,如上图所示,x 是以 i 为尾符合条件的子数组之和,可以推出:sum[ i ] - sum[ j ] = x ,以及 x % k = 0 ,得到 (sum[ i ] - sum[ j ])% k = 0 ;根据同余定理,推得:sum[ i ] % k = sum[ j ] % k 

        j 是位于 0 ~ i -1 区间中的下标,也就是说在 0 ~ i -1 区间中,找到多少个符合上述条件的前缀和,就知道以 i 下标为尾,符合条件的子数组有多少

        所以我们的思路就是用一个哈希表记录在 i 下标之前所有下标的前缀和 % k 的值对应的个数,以 sum[ i ] % k 为 key,个数为 value,从 0 下标开始遍历数组,在遍历到 i 下标时,我们已经知道了 i -1 下标的前缀和,i 下标的前缀和 sum[ i ] = sum[ i -1 ] +nums[ i ] ,通过 sum[ i ] % k 得到要在哈希表中寻找的 sum[ j ] % k 的值,在哈希表中  sum[ i ] % k 对应的值有多少个,就代表以 i 下标为尾,符合条件的子数组有多少个。

        以该方法遍历所有的下标,便能得到所有符合条件的子数组的个数。

        要注意一个细节,因为数组中存在负数,所以 sum[ i ] 可能为负数,在 java 中,负数 % 正数得到的是负数,为了去除负数的影响,所以在取模时不能直接用  sum[ i ] % k ,而是应该用式子 ( sum[ i ] % k + k)% k

        还有一个细节,当哈希表初始化的时候要直接加上 key = 0,value = 1 的数据,因为不加上的话,就无法记录 nums[ i ] % k = 0 (符合条件的子数组只有 nums[ i ] 这一个数据)这种情况了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开任务管理器的13种方法,总有一款适合你

任务管理器是一个很好的工具,可以帮助你管理应用程序、进程和服务在Windows PC上的运行方式。在使用任务管理器之前,你应该首先知道如何打开它。在本指南中,我们将向你展示运行它的不同方式,无论你使用的是Windows 11还是Windows 10。该列表包括启动任务管理器的十三种方法…

使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

文章目录 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布…

计算机组成原理综合3

41、计算机操作的最小时间单位是__________。A A. 时钟周期 B. 指令周期 C. CPU周期 D. 外围设备 42、微程序控制器中&#xff0c;机器指令与微指令的关系是__________。B A. 每一条机器指令由一条微指令来执行 B. 每一条机器指令由一段用微指令编成…

在做题中学习(35):判断字符是否唯一

面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;1.用哈希表&#xff08;创建另一个数组存储&#xff09;然后和原数组一一比对。 时间复杂度O&#xff08;N&#xff09; 空间复杂度 O&#xff08;N&#xff09; 2.位图&#xff08…

使用物理机的burpsuite抓取虚拟机的请求包(虚拟机代理配置)

关于burpsuite抓取本地浏览器的请求包大家应该都会配置吧 我也是第一次配抓取虚拟机的包&#xff0c;最开始遇到了些问题&#xff0c;这里简单给大家分享一下 下面以Windows系统下的Firefox浏览器为例&#xff1a; 首先我还是先添加了一个小狐狸&#xff08;foxyproxy&#…

ubuntu保存分辨率失效解决办法

在VM虚拟机中&#xff0c;遇到修改ubuntu分辨率后&#xff0c;重启后又重置的解决办法。 目前我的ubuntu版本是&#xff1a;ubuntu 18.04.6 版本。 1.首先&#xff0c;在你喜欢的目录建立一个.sh 脚本文件。 终端执行命令&#xff1a;sudo vim xrandr.sh 2.按 i 进入编辑状…

神经网络:优化器和全连接层

SGD&#xff08;随机梯度下降&#xff09; 随机梯度下降的优化算法在科研和工业界是很常用的。 很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。 举个例子&#xff1a;梯度下降&#xff08;Gradient Descent&#xff09;就好比一个人想从高山上奔跑到山谷最低…

[node] Node.js 缓冲区Buffer

[node] Node.js 缓冲区Buffer 什么是BufferBuffer 与字符编码Buffer 的方法概览Buffer 的实例Buffer 的创建写入缓冲区从 Buffer 区读取数据将 Buffer 转换为 JSON 对象Buffer 的合并Buffer 的比较Buffer 的覆盖Buffer 的截取--sliceBuffer 的长度writeUIntLEwriteUIntBE 什么是…

【51单片机系列】C51中的中断系统扩展实验

本文是关于51单片机中断系统的扩展实验。 文章目录 一、 扩展实验一&#xff1a;使用外部中断0控制蜂鸣器&#xff0c;外部中断1控制直流电机二、扩展实验二&#xff1a;修改定时器初值&#xff0c;设定3秒钟的定时时间让LED模块闪烁三、扩展实验三&#xff1a;使用定时器1和数…

【问题+解决】 less-loader下载

最近遇到一个less问题 情景 属于共建项目&#xff1b; 克隆下来&#xff0c;npm install&#xff0c;报错 按照提示下载了 less-loader&#xff0c;还是报错 经过 下载 npm install less-loader5.0.0 --save --dev npm install --save script-loader 都不对&#xff0c;下载成…

华为OD机试 - 区间交集 - 深度优先搜索dfs算法(滥用)(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述备注用例1、输入2、输出3、说明 四、解题思路1、核心思路&#xff1a;2、具体步骤 五、Java算法源码再重新读一遍题目&#xff0c;看看能否优化一下~解题步骤也简化了很多。 六、效果展示1、输入2、输出3、说明 华为OD机试 2…

Screen记录窗口输出日志

screen是Linux窗口管理器&#xff0c;用户可以建立多个screen会话&#xff0c;每个screen会话又可以建立多个window窗口&#xff0c;每一个窗口就像一个可操作的真实的ssh终端一样。 screen详解&#xff1a;http://www.linuxidc.com/Linux/2013-10/91612.htm Linux Screen超简…

laravel 安装新插件 topthink/think-migration

环境&#xff1a;本地虚拟机&#xff0c;跑docker容器&#xff0c;项目文件挂载到本地。 需进入docker容器中(本地无相关环境&#xff0c;比如swoole&#xff0c;无法执行命令。)&#xff0c;执行插件更新和使用命令执行相关的artisan命令。 比如安装插件 topthink/think-migr…

C++_动态二维数组的两种方法

介绍 本文主要介绍使用 动态二维数组的两种方法 (PS:仅作创建 动态二维数组参考,详细使用方法根据需求自行改变) 第一种&#xff1a;连续存储结构的 二维动态数组(需固定 列 大小&#xff0c;可通过下标访问) 缺点: 1.需要在设计二维数组前写死 列 的大小 2.空间利用率不高 优点…

打开和关闭GBASE南大通用数据库连接

下面的样例代码使用连接字符串通过GBASE南大通用Connection 类创建连接对象、 打开连接、关闭连接GBASE南大通用。 C# 示例&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using Sys…

PostgreSQL使用docker部署,设置密码失效问题处理

文章目录 问题描述使用场景排查解决修改已有的文件卷使用SQL初始化 问题描述 PostgreSQL使用docker虚拟化部署&#xff0c;使用docker-compose管理&#xff0c;配置了密码部署在客户现场时&#xff0c;客户的安全扫描&#xff0c;反馈测到PostgreSQL数据库弱密码漏洞查看docke…

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一 学习前言为什么每次训练结果不同什么是随机种子训练中设置随机种子 学习前言 好多同学每次训练结果不同&#xff0c;最大的指标可能会差到3-4%这样&#xff0c;这是因为随机种子没有设定导致的&#x…

解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案

Python作为一种流行的高级编程语言&#xff0c;它的独特特性之一就是全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;简称GIL&#xff09;。本文将深入探讨GIL的定义、工作原理以及对Python的影响&#xff0c;并介绍如何应对GIL的限制。 1. 什么是GIL&#xff1…

网络安全:专科及普通本科的温柔乡

当代普通大学生的现状是卷又卷不过、躺又躺不平&#xff0c;把大把的青春都荒废在了思考我应该做什么才能有前途的问题上面。当然&#xff0c;这里说的是那些普通学历且对自己的职业生涯甚至是人生没有规划的大学生&#xff0c;包括专科、普通一本二本&#xff0c;并非985、211…

MySQL-2

复习 1. Data数据–>DB数据库–>DBMS数据库管理系统常见DBMS: MySQL oracle sql server db2 … redis Mongodb两大功能&#xff1a; 定义DDL 操纵DML 2. 表table创建表, 行和列 3. MySQL数据类型数据类型分成三大类&#xff1a;数值型、字符型、日期时间类4. 关于列属性…