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

【Leetcode 每日一题】2845. 统计趣味子数组的数目

问题背景

给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums,以及整数 m o d u l o modulo modulo 和整数 k k k
请你找出并统计数组中 趣味子数组 的数目。
如果 子数组 n u m s [ l . . r ] nums[l..r] nums[l..r] 满足下述条件,则称其为 趣味子数组

  • 在范围 [ l , r ] [l, r] [l,r] 内,设 c n t cnt cnt 为满足 n u m s [ i ] nums[i] % modulo == k nums[i] 的索引 i i i 的数量。并且 c n t cnt % modulo = k cnt
    以整数形式表示并返回趣味子数组的数目。
    注意:子数组是数组中的一个连续非空的元素序列。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1nums.length105
  • 1 ≤ n u m s [ i ] ≤ 1 0 9 1 \le nums[i] \le 10 ^ 9 1nums[i]109
  • 1 ≤ m o d u l o ≤ 1 0 9 1 \le modulo \le 10 ^ 9 1modulo109
  • 0 ≤ k < m o d u l o 0 \le k < modulo 0k<modulo

解题过程

首先做一个转化,数组中的元素其实可以分为两类,划分的标准是是否满足 n u m s [ i ] m o d m o d u l o = k nums[i] \ mod \ modulo = k nums[i] mod modulo=k
如果将满足上述条件的元素用 1 1 1 来表示,不满足的用 0 0 0 来表示,那么符合条件的元素数目就等价于子数组的元素和,元素和可以通过前缀和方便地计算出来。
在前缀和数组 p r e S u m preSum preSum 中,要求 ( p r e S u m [ r i g h t ] − p r e S u m [ l e f t ] ) m o d m o d u l o = k (preSum[right] - preSum[left]) \ mod \ modulo = k (preSum[right]preSum[left]) mod modulo=k,也即 ( p r e S u m [ r i g h t ] − p r e S u m [ l e f t ] ) m o d m o d u l o = k m o d m o d u l o (preSum[right] - preSum[left]) \ mod \ modulo = k \ mod \ modulo (preSum[right]preSum[left]) mod modulo=k mod modulo p r e S u m [ r i g h t ] − p r e S u m [ l e f t ] preSum[right] - preSum[left] preSum[right]preSum[left] k k k 关于模 m o d u l o modulo modulo 同余, ( p r e S u m [ r i g h t ] − k ) m o d m o d u l o = p r e S u m [ l e f t ] m o d m o d u l o (preSum[right] - k) \ mod \ modulo = preSum[left] \ mod \ modulo (preSum[right]k) mod modulo=preSum[left] mod modulo
这样一来,只要用哈希表统计 p r e S u m [ l e f t ] m o d m o d u l o preSum[left] \ mod \ modulo preSum[left] mod modulo,再枚举右端点累计答案即可。

具体实现

class Solution {public long countInterestingSubarrays(List<Integer> nums, int modulo, int k) {int n = nums.size();int[] preSum = new int[n + 1];for (int i = 0; i < n; i++) {preSum[i + 1] = preSum[i] + (nums.get(i) % modulo == k ? 1 : 0);}int[] count = new int[Math.min(n + 1, modulo)];long res = 0;for (int item : preSum) {if (item >= k) {res += count[(item - k) % modulo];}count[item % modulo]++;}return res;}
}
http://www.xdnf.cn/news/137611.html

相关文章:

  • 技术面试一面标准流程
  • MiniMind模型的web交互功能初试
  • 28、.NET 中元数据是什么?
  • LeNet5 神经网络的参数解析和图片尺寸解析
  • 《R语言SCI期刊论文绘图专题计划》大纲
  • ​​激光雷达(LiDAR)数据​​ 的标准存储格式.las文件介绍
  • C++ (STL,顺序容器,关联容器,容器适配器)
  • 如何使用SeedProd创建无缝的WordPress维护页面
  • 【刷题Day26】Linux命令、分段分页和中断(浅)
  • AD相同网络的铜皮和导线连接不上
  • 5.2 AutoGen:支持多Agent对话的开源框架,适合自动化任务
  • 深入解析 Linux 中动静态库的加载机制:从原理到实践
  • 文件的读取操作
  • Unity3D IK解算器技术分析
  • 安卓手机下载谷歌浏览器遇到兼容问题怎么办【三步解决】
  • Move Registry 发布,实现 Sui 的超级互操作性
  • 大模型微调 - transformer架构
  • flume整合Kafka和spark-streaming核心编程
  • 什么是可重入锁ReentrantLock?
  • 使用el-table表格动态渲染表头数据之后,导致设置fixed的列渲染出现问题
  • 如何在IDEA中高效使用Test注解进行单元测试?
  • Linux 怎么找Java程序的监听的端口
  • 企业级AI开发利器:Spring AI框架深度解析与实战
  • 解释器体系结构风格-笔记
  • Vuex 和 Pinia 的区别
  • 第2讲:R语言中的色彩美学——科研图表配色指南
  • 用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
  • C语言指针5
  • Swift中Class和Struct的深度对比分析
  • VS Code搭建C/C++开发环境