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

【数据结构-哈希前缀】力扣2845. 统计趣味子数组的数目

给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k 。

请你找出并统计数组中 趣味子数组 的数目。

如果 子数组 nums[l…r] 满足下述条件,则称其为 趣味子数组 :

在范围 [l, r] 内,设 cnt 为满足 nums[i] % modulo == k 的索引 i 的数量。并且 cnt % modulo == k 。
以整数形式表示并返回趣味子数组的数目。

注意:子数组是数组中的一个连续非空的元素序列。

示例 1:
输入:nums = [3,2,4], modulo = 2, k = 1
输出:3
解释:在这个示例中,趣味子数组分别是:
子数组 nums[0…0] ,也就是 [3] 。

  • 在范围 [0, 0] 内,只存在 1 个下标 i = 0 满足 nums[i] % modulo == k 。
  • 因此 cnt = 1 ,且 cnt % modulo == k 。
    子数组 nums[0…1] ,也就是 [3,2] 。
  • 在范围 [0, 1] 内,只存在 1 个下标 i = 0 满足 nums[i] % modulo == k 。
  • 因此 cnt = 1 ,且 cnt % modulo == k 。
    子数组 nums[0…2] ,也就是 [3,2,4] 。
  • 在范围 [0, 2] 内,只存在 1 个下标 i = 0 满足 nums[i] % modulo == k 。
  • 因此 cnt = 1 ,且 cnt % modulo == k 。
    可以证明不存在其他趣味子数组。因此,答案为 3 。

示例 2:
输入:nums = [3,1,9,6], modulo = 3, k = 0
输出:2
解释:在这个示例中,趣味子数组分别是:
子数组 nums[0…3] ,也就是 [3,1,9,6] 。

  • 在范围 [0, 3] 内,只存在 3 个下标 i = 0, 2, 3 满足 nums[i] % modulo == k 。
  • 因此 cnt = 3 ,且 cnt % modulo == k 。
    子数组 nums[1…1] ,也就是 [1] 。
  • 在范围 [1, 1] 内,不存在下标满足 nums[i] % modulo == k 。
  • 因此 cnt = 0 ,且 cnt % modulo == k 。
    可以证明不存在其他趣味子数组,因此答案为 2 。
    在这里插入图片描述

哈希前缀

//(x-y) % m = k 变换 x % m - y % m = k
class Solution {
public:long long countInterestingSubarrays(vector<int>& nums, int modulo, int k) {int n = nums.size();unordered_map<int ,int> group;int count = 0;long long ans = 0;group[0] = 1;for(int i = 0;i < n;i++){count += nums[i] % modulo == k;ans += group[(count - k + modulo) % modulo];group[count % modulo]++;}return ans;   }
};
-------------------------------------------------
//力扣930。和相同的二元子数组
class Solution {
public:int numSubarraysWithSum(vector<int>& nums, int goal) {int sum = 0;unordered_map<int, int> cnt;int ret = 0;cnt[0] = 1;for (auto& num : nums) {sum += num;ret += cnt[sum - goal];cnt[sum]++;}return ret;}
};

这道题的解题方式和力扣930的解法很相似,也是求满足一定条件的子数组的数量。这道题有几个关键的步骤:
第一个是转换,将符合条件的nums[i]转换成1,否则转换成0。
第二个是要清楚数学公式(x-y) % m = k 变换 x % m - y % m = k
第三个是要初始化哈希表,令group[0] = 1。
最后遍历数组,进行统计。

在时间复杂度和空间复杂度上,都是O(n)。但是由于使用数组vector的索引访问速度比 unordered_map更快,因为它是连续内存块,而 unordered_map 需要计算哈希值并进行冲突处理,所以使用数组的效率会更高。

  long long countInterestingSubarrays(vector<int> &nums, int mod, int k) {int n = nums.size();vector<int> cnt(n + 1);cnt[0] = 1;long long ans = 0;int s = 0;for (int x: nums) {if (x % mod == k)s = (s + 1) % mod;int s2 = (s - k + mod) % mod;if (s2 <= n)ans += cnt[s2];cnt[s]++;}return ans;}
};

使用数组的原理和哈希表类似。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多线程锁机制面试
  • 素数与最大公约数GCD:
  • 基于MVC模式的红色革命文物征集管理系统的设计与实现--论文pf
  • 技术速递|Python in Visual Studio Code 2024年8月发布
  • Node.js版本管理工具之NVM
  • C#关于多线程的线程问题
  • Vue:从入门到放弃
  • 智慧水务项目(七)vscode 远程连接ubuntu 20.04 服务器,调试pyscada,踩坑多多
  • 回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错!WOA-SVM-Adaboost
  • 探索AAA系统:网络安全与访问控制的核心机制
  • 中英双语介绍金融经济中的鹰派 (Hawkish)和鸽派 (Dovish)
  • 借助Aapose.Cells 使用 C# 在 Excel 中读取、添加和编辑线程注释
  • 从零开始学数据结构系列之第四章《什么是关键路径》
  • windows hook之进程防杀(任务管理器)
  • Python爬虫技术与K-means算法的计算机类招聘信息获取与数据分析
  • 【笔记】你不知道的JS读书笔记——Promise
  • golang 发送GET和POST示例
  • iOS 颜色设置看我就够了
  • javascript数组去重/查找/插入/删除
  • JAVA之继承和多态
  • java中的hashCode
  • JS专题之继承
  • linux学习笔记
  • MySQL QA
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP 7 修改了什么呢 -- 2
  • PHP的Ev教程三(Periodic watcher)
  • Python学习之路16-使用API
  • zookeeper系列(七)实战分布式命名服务
  • 大数据与云计算学习:数据分析(二)
  • 分布式任务队列Celery
  • 聊聊redis的数据结构的应用
  • 数据仓库的几种建模方法
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 再次简单明了总结flex布局,一看就懂...
  • 正则表达式
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 移动端高清、多屏适配方案
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​第20课 在Android Native开发中加入新的C++类
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (6)添加vue-cookie
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (ZT)薛涌:谈贫说富
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (四)React组件、useState、组件样式
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET 事件模型教程(二)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明