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

news2024/11/15 13:50:05

给你一个下标从 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;
    }
};

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

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

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

相关文章

springboot打包找不到主类

1.打包jar包 idea中点击项目结构project stucture ,选择artfacts 2.

机器学习辅助复合材料预测,性能管理优化创新材料,这种王炸般的组合,还真是大开眼界!

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能力…

网络空间安全考研方向:5大专业值得选择,你喜欢哪一个?

网络空间安全考研方向包括网络与信息安全、信息安全工程、信息对抗技术、信息安全与管理、网络安全与执法等专业&#xff0c;旨在培养网络安全领域的高级专业人才&#xff0c;涵盖网络攻击与防御、信息加密与解密、信息安全评估与管理等核心知识与技能&#xff0c;为国家和社会…

4、物品抓取(6自由度机械臂逆运动学)

目录 1.坐标系建立 2.运用解析法计算各个舵机旋转角度 ​3.举例 1.坐标系建立 采用笛卡尔坐标系图1&#xff0c;即由三个互相垂直的坐标轴所组成的坐标系&#xff0c;以机械臂正向为X轴方向&#xff0c;横向为Y轴方向&#xff0c;纵向为Z轴方向。 图1 笛卡尔坐标系 2.运用…

实现qt的多语言转换

前言&#xff1a;qt实现多语言转换主要&#xff0c;用到lrelease.exe&#xff0c;在QT下运行图片和语言转换&#xff0c;需要对对应格式的内容进行转换。图片和语言&#xff0c;甚至是字体均是通过添加.qrc配置&#xff0c;来转换。图片转换成.rcc格式。而语言通过在.excel编辑…

觉飞内衣洗衣机怎么样?各维度专业剖析觉飞、希亦、由利三大机型

由于我们的内衣、内裤和袜子等等贴身小件衣物的清洁频率比一般的衣物要高。而且&#xff0c;如果我们人工手洗的话&#xff0c;不仅会大大浪费了我们的时间&#xff0c;而且还不能进行对这些贴身的以为进行深层消毒和除菌。这种情况下&#xff0c;就得需要一台专门用于清洗内衣…

Passware Kit Mobile

Passware Kit Mobile Passware Kit Mobile年度许可证最多支持 300 次成功移动设备提取&#xff0c;并且每年可续订。年度试用许可证最多支持 5 次成功提取。 从移动设备提取和解密用户数据的取证工具。 最先进的移动取证工具 Passware 取证产品被世界顶级执法机构用于破获需要解…

编译Android使用的ffmpeg库

1 下载NDK 官网&#xff1a;NDK 下载 | Android NDK | Android Developers 2 下载ffmpeg 官网&#xff1a;FFmpeg 3 下载配置msys2 在我之前的博客中有写windows下编译ffmpeg 最详细教程_windows 编译 ffmpeg-CSDN博客 4 编写编译脚本 在ffmpeg的路径下新建一个脚本…

【原创教程】电气电工06:打孔攻丝篇

打孔攻丝,是我们电气电工工作中经常遇到的,比如我们要在某个地方安装一个传感器,我们需要固定在底板上,这时候就需要我们会这个基本技能;我们在柜内布局安装板时,也需要进行打孔攻丝。 下面我们介绍一下这项技能。 首先我们先要熟悉钻头和丝锥,我们来…

STM32标准库学习笔记-11.I2C通信

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司八十年代推出的一种通用数据总线两根通信线&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff0…

适用于所有Android手机的5个最佳Android手机解锁工具

在当今互联互通的世界中&#xff0c;我们移动设备的安全至关重要。但是&#xff0c;由于忘记密码、屏幕破裂或其他不可预见的问题&#xff0c;用户可能会发现自己被锁定在 Android 设备之外。为了满足这一需求&#xff0c;出现了各种 Android 解锁工具&#xff0c;提供创新的解…

CMake编译不同文件目录下的C++文件

由于我们构建一个项目的时候&#xff0c;通常不会将所有的源文件放在一个文件目录下&#xff0c;这样既不方便开发&#xff0c;也不方便源码阅读&#xff0c;我们通常会对项目文件进行分层&#xff0c;比如分为include、src、res、lib这些目录&#xff0c;src下又分为model、co…

解决怎样在使用Signal Tap进行在线调试时,单独编译工程没有报错,而在Signal tap添加了信号之后进行时编译报错。

问题 如下图所示&#xff0c;我们在Signal Tap中添加完相应的信号之后对于工程进行重新编译时&#xff0c;显示报错信息&#xff1a; 报错原因 这里错误显示的时我们使用的设备只有30个 类型为M9K的RAM位置。然而&#xff0c;当前设计需要超过30个位置才能成功适配。意思就是…

<Linux> 进程控制

目录 一、进程创建 1. fork函数 2. fork函数返回值 3. 写时拷贝 4. fork常规用法 5. fork调用失败原因 6. 如何创建多个子进程&#xff1f; 二、进程终止 1. 进程退出场景 2. 进程退出码 3. errno 4. 进程异常退出 5. 进程常见退出方法 5.1 return退出 5.2 exit退出 5.3 _ex…

JavaFX入门01 制作简易计算器

目录 利用JavaFX Scene Builder 2.0制作图形界面将fxml文件导入IDEA中&#xff0c;并添加JavaFX相关依赖定义启动类&#xff0c;呈现界面定义控制类&#xff0c;实现具体逻辑运行代码&#xff0c;进行测试 利用JavaFX Scene Builder 2.0制作图形界面 制作完成后&#xff0c;将其…

C语言之“ 数组 ”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C语言基础 目录 前言 一、数组 二、一维数组 2.1 一维数组的创建和初始化 数组创建 数组初始化 数组类型 2.2 一维数组的使用 数组下标 数组打印 数组输…

Spring由于后端逻辑,前端无法展示数据

1.Spring由于后端逻辑&#xff0c;前端无法展示数据 1.代码详情 后端逻辑&#xff1a;在ctroller层&#xff0c;调用getList方法返回的是List列表 使用枚举类来定义了状态码&#xff1a; 状态码SUCCESS返回result类 前端代码&#xff0c;if条件里面是根据自定义的状态码来进…

RM集团在造船中应用虚拟现实辅助工程技术

船舶内饰中的虚拟现实辅助工程 设计船舶内饰是一项资源密集型任务&#xff0c;全球范围内有数百名工程师参与到大型造船项目中。如今&#xff0c;作为船舶内饰设计领域的专家&#xff0c;R&M集团正在利用虚拟现实辅助工程(VAE)技术&#xff0c;优化开发流程。 从游轮上的餐…

浅谈如何克服编程学习中的挫折感

目录 1.概述 2.心态调整 3.学习方法 3.1. 基础知识的打牢 3.2. 分解问题 3.3. 理论与实践相结合 3.4. 利用在线资源和社区 3.5. 教学 3.6. 定期复习与总结 3.7. 持续学习和适应新技术 3.8. 解决实际问题 4.成功经验 5.总结 1.概述 在编程学习的过程中&#xff0c…

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)

目录 1. RTMP_ConnectStream函数1.1 读取packet&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…