当前位置: 首页 > news >正文

算法:974.和可以被K整除的子数组

题目

链接:leetcode链接

在这里插入图片描述

思路分析(前缀和 + 同余定理)

首先,我们要了解一下什么是同余定理

同余定理:
如果(a - b)/ p = k …… 0
则 a % p == b % p

证明我写在草稿纸上,如下图:
在这里插入图片描述

初此之外,我们还需要理解一个问题
在C++/java中负数取模会怎么样呢?
比如 - 2 % 5等于多少呢?
按道理来说应该是3,但是C++/java里的答案是-2
这明显是需要进行修正的

如何进行修正呢?
我们只需要( a % p + p)% p
这样,无论是正数取模还是负数取模都不会出现问题。

OK,到这里前置知识讲完了,我们就正式开始讲思路了。

需要找一个子数组的和是k的倍数
那么只需要找两个区间的前缀和对k取模的余数相同即可。

和这道题的思路非常相似
传送门:560.和为k的子数组

我们利用滚动数组去求前缀和,
记录sum % k的余数
然后在[0,i-1]区间内去hash表中寻找一个区间的前缀和对k取模的结果与sum对k取模结果相同即可
将sum% k的余数放到hash表中(一定要是先查找在插入)

细节:
(1)什么时候插入hash表
一定要是先查找,在插入
(2)对于[0 , i]区间的和正好是K的倍数的情况如何处理
还是一样,我们先去把余数0提前先往hash表里插一个即可
具体原因可以查看和为k的子数组这篇文章

代码

//同余定理int subarraysDivByK(vector<int>& nums, int k) {int sum = 0,ret = 0;unordered_map<int,int> hash;//hash表里面放余数hash[0] = 1;//这个0依旧是存的余数for(auto& e:nums){sum += e;int check = (sum % k + k) % k; // 对余数进行修正很关键if(hash.count(check))  ret += hash[check]; hash[check]++;}return ret;}
http://www.lryc.cn/news/458790.html

相关文章:

  • QD1-P8 HTML 格式化标签(font、pre、b、strong、i、u、del、s、sub、sup)
  • 红米Turbo 3工程固件预览 修复底层 体验原生态系统 默认开启diag端口
  • sql的调优指南及高级sql技巧
  • 生成式专题的第一节课---GAN图像生成
  • 中科星图GVE(案例)——AI实现建筑用地变化前后对比情况
  • Spring Boot中获取application.yml中属性的几种方式
  • YOLO11改进 | 注意力机制 | 结合静态和动态上下文信息的注意力机制
  • Python中函数的使用方法
  • 遨游智能终端赋能“危急特”场景,力推北斗技术规模化应用!
  • 构建流媒体管道:利用 Docker 部署 Nginx-RTMP 从 FFmpeg RTMP 推流到 HLS 播放的完整流程
  • 【汇编语言】寄存器(CPU工作原理)(六)—— 修改CS,IP的指令以及代码段
  • 机器学习与神经网络:从技术前沿到诺贝尔奖的跨越与未来展望
  • java 洛谷题单【数据结构1-2】二叉树
  • 项目优化内容及实战
  • 科研绘图系列:R语言蝴蝶图(Butterfly Chart)
  • 【FPGA开发】Modelsim如何给信号分组
  • Apache SeaTunnel 9月份社区发展记录
  • 系统架构设计师:数据库系统相关考题预测
  • 污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标,10000余张图像,yolo格式目标检测,9GB数据量。
  • c++(多态)
  • 【网络协议】TCP协议常用机制——延迟应答、捎带应答、面向字节流、异常处理,保姆级详解,建议收藏
  • 财政部官宣: 国家奖学金,涨了!
  • antd table合并复杂单元格、分组合并行、分组合并列、动态渲染列、嵌套表头
  • 一键安装与配置Stable Diffusion,轻松实现AI绘画
  • 模板和静态文件
  • Android Studio 打包aar丢失远程依赖问题解决
  • Chromium 搜索引擎功能浅析c++
  • DDoS攻击快速增长,如何在抗ddos防护中获得主动?
  • MongoDB 死锁 锁定问题
  • 鸿蒙--商品列表