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.hqwc.cn/news/290294.html

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

相关文章

OSPF面试总结

OSPF 基本特点 属于IGP、LS支持无类域间路由没有环路&#xff08;区域内运行LS、区域间是DV,所以所有的区域要和区域0相连&#xff09;收敛速度快使用组播发送数据 224.0.0.5、224.0.0.6 什么时候用224.0.0.5&#xff1f;支持多条等价路由支持协议报文认证 OSPF路由的计算过程…

Leetcode—179.最大数【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—179.最大数 算法思想 实现代码 其中sort的lambda自定义排序策略参考自官方文档 class Solution { public:string largestNumber(vector<int>& nums) {string ans;vector<string> strs;for(auto num: …

Prompt-to-Prompt:基于 cross-attention 控制的图像编辑技术

Hertz A, Mokady R, Tenenbaum J, et al. Prompt-to-prompt image editing with cross attention control[J]. arXiv preprint arXiv:2208.01626, 2022. Prompt-to-Prompt 是 Google 提出的一种全新的图像编辑方法&#xff0c;不同于任何传统方法需要用户指定编辑区域&#xff…

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

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

在.NET 应用程序中使用DSN-GBASE南大通用

在.NET 应用程序中使用GBASE南大通用 machine.config 文件中的资源时&#xff0c;首先需在工程中 引用 .NET Framework 的组件GBASE南大通用 System.configuration&#xff0c;然后使用 using 语句将GBASE南大通用System.configuration 命名空间中的类引入到工程中。 1) 在工…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能&#xff0c;需要将对话内容流式返回给前端页面&#xff08;类似GPT的效果&#xff09;。下面直接说下如何实现&#xff1a; 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

Ubuntu 常用命令之 gzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 gzip 是一个在 Linux 和 Unix 系统中常用的文件压缩工具。它的名字来源于 GNU zip&#xff0c;作为一个自由软件&#xff0c;它是 GNU 项目的一部分。gzip 命令通常用于压缩文件&#xff0c;以节省磁盘空间&#xff0c;或者减小文…

生成对抗网络与人工智能的完美融合:创新、艺术与未来

导言 生成对抗网络&#xff08;GAN&#xff09;作为一种深度学习框架&#xff0c;以其独特的生成能力引起广泛关注。生成对抗网络&#xff08;GAN&#xff09;与人工智能的结合不仅在科学领域引起了巨大的关注&#xff0c;也在艺术、医学等多个领域催生了令人振奋的创新。本文将…

gitee版本回退本地和仓库的执行步骤(后悔药,无副作用,按说明书使用)

目录 1.本地回退 1.打开项目文件夹 3.回退到指定版本 4.选择回退模式并确认 5.本地回退成功 2.回退仓库版本 1.在git上面找到项目的提交记录 2.找到提交错误的版本​编辑 3.双击新页面这个版本进去 点击操作再点击revert​编辑 4.确认回退 ​5.仓库回退成功 在使用…

自己制作指定格式的bmp文件

1、CAD绘制形状&#xff0c;设置区域方便接下里操作 2、导出为pdf&#xff08;导出的png或者Jpg极度不清晰&#xff09; 打印->自己设置->框选范围 3、截图截取制作的bmp范围&#xff0c;保存为bmp或png 我这里是通过snagit保存为png的 4、微软自带截图另存png为bmp&…

将qt程序注册成服务

将qt程序注册成服务 1、qt服务模块管理下载 qt-solutions 2、QtService项目 2.1、将qtservice拷贝到项目代码路径 2.2、实现服务管理 PS&#xff1a;响应服务的启停 CustomService.h #include <QCoreApplication> #include "qtservice.h"class CustomSer…

【yolov8系列】 yolov8 目标检测的模型剪枝

前言 最近在实现yolov8的剪枝&#xff0c;所以有找相关的工作作为参考&#xff0c;用以完成该项工作。 先细读了 Torch-Pruning&#xff0c;个人简单记录了下 【剪枝】torch-pruning的基本使用&#xff0c;有框架完成的对网络所有结构都自适应剪枝是最佳的&#xff0c;但这里没…