【数据结构-哈希前缀】力扣1590. 使数组和能被 P 整除

news2024/11/25 13:47:09

给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。

请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。

子数组 定义为原数组中连续的一组元素。

示例 1:
输入:nums = [3,1,4,2], p = 6
输出:1
解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。

示例 2:
输入:nums = [6,3,5,2], p = 9
输出:2
解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。

示例 3:
输入:nums = [1,2,3], p = 3
输出:0
解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。

示例 4:
输入:nums = [1,2,3], p = 7
输出:-1
解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除。

示例 5:
输入:nums = [1000000000,1000000000,1000000000], p = 3
输出:0
在这里插入图片描述

哈希前缀

class Solution {
public:
    int minSubarray(vector<int>& nums, int p) {
        // y是较长前缀和,z是较短前缀和
        // (y - z) mod p = x 等价 (y-x) mod p = z
        int sum = 0;
        for(int k : nums){
            sum = (sum + k) % p;
        }

        if(sum == 0){
            return 0;
        }

        unordered_map<int, int> group;
        int res = nums.size(), y = 0;
        for(int i = 0; i < nums.size();i++){
            group[y] = i;
            y = (y + nums[i]) % p;  //前缀和 mod p
            if(group.count((y - sum + p) % p) == 1){
                res = min(res, i - group[(y - sum + p) % p] + 1);
            }
        }
        return res == nums.size() ? -1 : res;
    }
};

这几个等式看不懂的,强烈建议可以看主页力扣974中相关链接,有对计算机中模运算的详细解释。

(y - z) mod p = x mod p 等价 (y-x) mod p = z mod p

(y - z) mod p = (y mod p - z mod p + p) mod p

(y mod p - x mod p + p) mod p = z mod p

理解几个等式是解题的关键。(y - z) mod p = x mod p这个等式意味着子段和 mod p的结果与nums全部元素和 mod p的结果一样,这时候说明减去这个子段,剩下子段刚好可以被p整除。

因为x mod p,即元素和 mod p的结果是已知的,而且z mod p的结果在遍历时候逐一储存到哈希表中,在已知y mod p的情况下,不妨进行变换,(y mod p - x mod p + p) mod p = z mod p,这时候我们只需要查找z mod p,即较短前缀和 mod p的结果是否储存在哈希表中,如果有的话,由于哈希表值储存的是对应下标,且如果出现相同键会进行更新,以最新也就是最右边的键为准,满足题意最短子段,所以可以通过当前数组下标减去对应哈希表中储存的值然后+1即可。

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

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

相关文章

模型类DTO、PO、VO

项目中有三类模型类:DTO数据传输对象、PO持久化对象&#xff0c;DTO用于接口层向业务层之间传输数据&#xff0c;PO用于业务层与持久层之间传输数据&#xff1b;有些项目还会设置V0对象&#xff0c;V0对象用在前端与接口层之间传输数据&#xff0c;当前端有多个平台且接口存在差…

pr转场预设导入方法怎么操作?

最近很多小伙伴问我一种问题&#xff0c;那就是pr转场预设如何导入&#xff1f;premiere无法导入预设prfpset文件&#xff0c;双击文件导入不行&#xff0c;pr内部点导入文件也不行&#xff0c;显示文件格式不支持&#xff0c;每当遇到这样的问题&#xff0c;同学们都会十分苦恼…

Ubuntu下交叉编译器工具链的安装方法

本篇文章记录Ubuntu下交叉编译器工具链的安装方法。 目录 一、交叉编译器 1、交叉编译器简介 2、获取交叉编译器 3、安装交叉编译器 4、安装相关库 二、结语 一、交叉编译器 1、交叉编译器简介 交叉编译器是一种编译器&#xff0c;它在一种平台上运行&#xff0c;但生成…

爱思唯尔这三个latex模版有什么区别?

这三个模板在大部分内容上是相同的&#xff0c;主要的区别在于它们处理引用和参考文献的方式。这三种模板分别对应不同的文献引用需求&#xff0c;这通常是根据目标期刊的具体要求来决定的&#xff1a; Harvard style&#xff08;elsarticle-template-harv.tex&#xff09;&…

超详细!!!electron-vite-vue开发桌面应用之数据全局状态管理pinia配置(八)

云风网 云风笔记 云风知识库 在这个项目中采用pinia进行全局状态管理 Pinia符合直觉的 Vue.js 状态管理库 ‌Pinia和‌Vuex的主要区别如下&#xff1a; 架构设计 Vuex采用了集中式的架构&#xff0c;将所有的状态存储在一个单一的全局状态树中&#xff0c;通过‌mutations和…

第三届IEEE云计算、大数据应用与软件工程国际学术会议 (IEEE-CBASE 2024,10月11-13)

第三届IEEE云计算、大数据应用与软件工程国际学术会议 ( CBASE 2024 &#xff09;将于2024年10月11—13日在中国杭州举办。 该会议在连续两届成功举办的基础上&#xff0c;本届将由浙江水利水电学院、浙江省自动化学会、浙江省科协智能制造学会联合体主办&#xff0c;浙江水利水…

三十七、【人工智能】【机器学习】【监督学习】- AdaNet算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

【Linux】自主编写简单shell

目录 一、C文件接口 二、系统文件I/O 1 .接口介绍 2 .open函数返回值 3 . 文件描述符fd 4 . 文件描述符的分配规则 5 .重定向 6 .使用 dup2 系统调用 7 .FILE 三、缓冲区 一、C文件接口 写文件&#xff1a; #include <stdio.h> #include <string.h> int main(…

Allegro如何调整PCB颜色亮度?

在用Allegro进行PCB设计时,有时候打开别人的PCB板或Demo板,然后在此基础上设计,但发现颜色太亮太刺眼了,不太习惯,那如何调整PCB的亮度呢? PCB板颜色的显示亮度太亮。如下图 下面详细介绍具体设置的方法: 1、选择菜单栏Display→Color/Visibility(颜色/可见度) 2、跳出…

SpringBoot3 + Flowable7 工作流引擎使用笔记

目录 Flowable 简介流程设计器安装使用 SpringBoot 3 整合表结构流程部署启动流程流程审批流程挂起和激活任务分配固定分配表达式分配值表达式方法表达式 监听器分配 流程变量运行时变量历史变量 身份服务候选人拾取任务归还任务指派给别人候选人组创建用户创建用户组用户关联用…

startData

某音startData 记得加入学习群&#xff1a; python爬虫&js逆向3 714283180

贝壳财报解读:彰显韧性,下场拿地,迈向新周期

众所周知&#xff0c;当前我国房地产行业已经迈入“存量房时代”&#xff0c;相比“大扩张时代”&#xff0c;更偏细水长流型&#xff0c;也为贝壳这类“科技驱动的一站式新居住服务平台”&#xff0c;提供了发展舞台。 日前&#xff0c;贝壳披露2024年第二季度财报&#xff1…

第40课 Scratch入门篇:绘制围棋棋盘

绘制围棋棋盘 故事背景: 作为一个围棋手,要有一个好的棋盘才行,让我们来设计一个属于自己的棋盘吧! 程序原理: 这节课的原理很简单,就是通过x,y坐标的偏移来画线,难度就是坐标点的设置,其实坐标用的习惯了,这块也不复杂,让我们一起开始学习! 开始编程 1、删除预…

鸿蒙Text部分文字变色

工具类&#xff1a; export class TextUtil {public static readonly REGEX_B_S "<B>"public static readonly REGEX_B_E "</B>"/*** 获取高亮字符串列表* param str 原始字符串*/public static getHlList(str ?: string, regex ?: strin…

【docker】Dockerfile练习

1、overlay文件系统原理测试 cd /mnt mkdir A B C worker merged echo "From A">./A/a.txt echo "From A">./A/b.txt echo "From A">./A/c.txt echo "From B">./B/a.txt echo "From B">./B/d.txt echo &quo…

smallpdf: 免费高效的PDF水印添加工具

引言 在数字文档管理和分享的过程中&#xff0c;保护版权和确保文档的原创性变得尤为重要。PDF文件作为一种广泛使用的格式&#xff0c;经常需要添加水印来表明所有权或提醒查看者注意文档的敏感性。本文将介绍一款名为smallpdf的免费工具&#xff0c;它能够轻松地为PDF文件添…

第41课 Scratch入门篇:显示声波图形

显示声波图形 故事背景: 电脑的麦克风可以收到各种声音,我们来看看,通过图形把麦克风的声音显示出来,设计一个绘制声音的声波图形 程序原理: 这节课的原理很简单,就是通过x,y坐标的偏移来画线,难度就是坐标点的设置,其实坐标用的习惯了,这块也不复杂,让我们一起开始…

R是一种强大的编程语言和环,你为何还需要RStudio?

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 2章1节&#xff1a;R和RStudio的下载和安装&#xff08;Windows 和 Mac&#xff09;_r…

机器学习深度学习中的Warmup技术是什么?

机器学习&深度学习中的Warmup技术是什么&#xff1f; 在机器学习&深度学习模型的训练过程中&#xff0c;优化器的学习率调整策略对模型的性能和收敛性至关重要。Warmup是优化器学习率调整的一种技术&#xff0c;旨在改善训练的稳定性&#xff0c;特别是在训练的初期阶…

netCDF文件读写处理

1.什么是 NetCDF&#xff1f; NetCDF 是一组软件库和自描述、独立于机器的数据格式&#xff0c;支持创建、访问和共享面向数组的科学数据。NetCDF 由Unidata开发和维护。Unidata 提供用于地球科学教育和研究的数据和软件工具。Unidata 是大学大气研究公司 ( UCAR ) 社区计划 (…