Leetcode.1590 使数组和能被 P 整除

题目链接

Leetcode.1590 使数组和能被 P 整除 rating : 2039

题目描述

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

请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 − 1 -1 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

提示:
  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \leq nums.length \leq 10^5 1nums.length105
  • 1 ≤ n u m s [ i ] ≤ 1 0 9 1 \leq nums[i] \leq 10^9 1nums[i]109
  • 1 ≤ p ≤ 1 0 9 1 \leq p \leq 10^9 1p109

解法:前缀和 + 哈希表t

t
假设整个数组 n u m s nums nums 的和为 s s s,那么 k = s m o d p k = s\ mod\ p k=s mod p

  • 如果 k = 0 k = 0 k=0,说明整个数组的和都可以被 p p p 整除,所以不需要移除元素,直接返回 0 0 0
  • 如果 k ≠ 0 k \neq 0 k=0假设我们需要移除的这个子数组和为 t t t,那么 t m o d p = k t\ mod\ p = k t mod p=k,并且还要要求这个子数组的长度是最短的。

假设区间 [ j , i ] [j,i] [j,i] 的子数组满足这个条件,我们用 s u m sum sum 表示 n u m s nums nums 的前缀和,即:

( s u m [ i ] − s u m [ j − 1 ] ) m o d p = k (sum[i] - sum[j-1])\ mod\ p = k (sum[i]sum[j1]) mod p=k

再转换一下:

s u m [ j − 1 ] m o d p = s u m [ i ] m o d p − k sum[j-1]\ mod\ p = sum[i]\ mod\ p - k sum[j1] mod p=sum[i] mod pk

由于 s u m [ j ] m o d p − k sum[j]\ mod\ p - k sum[j] mod pk 有可能是负数,所以我们需要再将其转换为整数:

s u m [ j − 1 ] m o d p = ( s u m [ i ] m o d p − k + p ) m o d p sum[j-1]\ mod\ p = (sum[i]\ mod\ p - k + p)\ mod\ p sum[j1] mod p=(sum[i] mod pk+p) mod p

我们用哈希表来记录这个 s u m [ i ] m o d p sum[i]\ mod\ p sum[i] mod p,值就是其对应的下标 i i i

我们令 k e y = ( s u m [ i ] m o d p − k + p ) m o d p key = (sum[i]\ mod\ p - k + p)\ mod\ p key=(sum[i] mod pk+p) mod p,如果对于当前 k e y key key,哈希表 m p mp mp 中有记录,则 j = m p [ k e y ] j = mp[key] j=mp[key]。说明移除此时的子数组 [ j , i ] [j,i] [j,i] 就能使 n u m s nums nums 的剩余元素满足条件,那么我们更新答案 a n s ans ans

注意:

  • 哈希表 m p mp mp 初始时需要加入 { 0 , − 1 } \{0 , -1 \} {0,1}
  • a n s ans ans 是最终的答案,需要移除的最短子数组的长度,初始化为一个较大的数即可;

时间复杂度: O ( n ) O(n) O(n)

C++代码:

using LL = long long;class Solution {
public:int minSubarray(vector<int>& nums, int p) {int n = nums.size();LL sum = 0;for(auto x:nums) sum += x;int k = sum % p;if(k == 0) return 0;unordered_map<int,int> mp{{0 , -1}};int ans = n;sum = 0;for(int i = 0;i < n;i++){sum += nums[i];auto key = (sum % p - k + p)%p;if(mp.find(key) != mp.end()){auto j = mp[key];ans = min(ans , i - j);}mp[sum % p] = i;}return ans == n ? -1 : ans;}
};

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

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

相关文章

u-popup组件在UniApp中的讲解

u-popup 组件是 UniApp 中一个多功能且强大的组件&#xff0c;UniApp 是一个使用 Vue.js 开发跨平台应用程序的框架。u-popup 组件提供了一种在应用程序的其他内容上方显示临时或浮动内容的方式。 使用方法&#xff1a; 要在 UniApp 项目中使用 u-popup 组件&#xff0c;你需要…

【React】打包体积分析 source-map-explorer

通过分析打包体积&#xff0c;才能知道项目中的哪部分内容体积过大&#xff0c;方便知道哪些包需要进一步优化。 使用步骤 安装分析打包体积的包&#xff1a;npm i source-map-explorer在 package.json 中的 scripts 标签中&#xff0c;添加分析打包体积的命令对项目打包&…

【C++】多线程(一):std::thread的使用

这篇文章应我朋友的邀请&#xff0c;写一篇文章介绍下C多线程。 编译环境准备 首先确定你的编译器支持std的thread&#xff0c;如果不支持&#xff0c;就会出现诸如“thread找不到”的问题。 以下假设你使用 gnu gcc 编译器&#xff0c;因为 MSVC 的我也不太熟悉。 linux …

Effective Modern C++(1.顶层const与底层const)

1.顶层const与底层const的定义 const修饰的变量不可以改变&#xff0c;那么他就是顶层const&#xff0c;如&#xff1a; const int a 10; 那么&#xff0c;对于 const int *const p new int(10); 第二个const就是顶层const&#xff0c;因为他修饰的是p&#xff1b;第一个…

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)

FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证&#xff0c;主要验证方式包括以下三种&#xff1a;   1&#xff09;手工注册验证类&#xff0c;并在控制器或其它模块中调用验证&#xff1b;   2&#xff09;基于ASP.NET验证管道&#xff08;validation …

Visual Studio 中文注释乱码解决方案

在公司多人开发项目中经常遇到拉到最新代码&#xff0c;发现中文注释都是乱码&#xff0c;很是emjoy..... 这是由于编码格式不匹配造成的&#xff0c;如果你的注释是 UTF-8 编码&#xff0c;而文件编码是 GBK 或者其他编码&#xff0c;那么就会出现乱码现象。一般的解决办法是…

打包SpringBoot 项目为本地应用

使用工具&#xff1a;exe4j、Inno Setup Compiler 步骤&#xff1a; 1&#xff0c;将dll包放入项目根路径下&#xff1b; 2&#xff0c;idea 使用Maven打jar包&#xff1b; 3&#xff0c;使用exe4j 工具进行打包&#xff1b; 打开工具首页不动&#xff08;直接 next&#xff…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)三

十三、如何检测子Shell和子进程&#xff1f; 上节我们说了子 Shell 和子进程的区别&#xff0c;这节就来看一下如何检测它们。 我们都知道使用 $ 变量可以获取当前进程的 ID&#xff0c;我在父 Shell 和子 Shell 中都输出 $ 的值&#xff0c;只要它们不一样&#xff0c;不就是…

leetcode_828_统计子串中的唯一字符

题意&#xff1a;所有子串中单个字符出现的次数和 问题转化&#xff1a;对于串中的每个字符&#xff0c;只包含其一次的所有子串的个数和 关于求只包含某位置字符一次的子串个数 class Solution { public:int uniqueLetterString(string s) {/* ...A...A...A...*/int n s.size…

第二十二章 解读pycocotools的API,目标检测mAP的计算COCO的评价指标(工具)

Pycocotools介绍 为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集&#xff0c;用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi&#xff0c;这些api有助于在COCO中加载、解析和可视化注释。 …

【Skynet 入门实战练习】实现网关服务 | 用户代理 | RPC 协议 | 客户端

文章目录 前言网关服务RPC 协议看门狗服务代理服务客户端逻辑梳理 前言 上两章学习了如何搭建一个项目&#xff0c;简单实现了几个基础模块。本章节会实现基本的客户端与服务端的通信&#xff0c;包括网关&#xff08;gate&#xff09;、看门狗&#xff08;watchdog&#xff0…

springBoot常见的问题

文章目录 Spring Boot 中的监视器是什么&#xff1f;如何在 Spring Boot 中禁用 Actuator 端点安全性&#xff1f;我们如何监视所有 Spring Boot 微服务&#xff1f;如何集成 Spring Boot 和 ActiveMQ&#xff1f;什么是 Swagger&#xff1f;你用 Spring Boot 实现了它吗&#…

不适合当老师怎么转岗

作为一名老师&#xff0c;你需要耐心、热情、知识储备丰富&#xff0c;还要有一定的演讲技巧。但有时候&#xff0c;即使具备了这些条件&#xff0c;你仍然可能觉得自己的个性或能力并不适合这个职业。那么&#xff0c;该如何转岗呢&#xff1f;别担心&#xff0c;我们为你提供…

玉渊谭天对电影色彩分析的“蚊香图”复现-python

视频教程链接&#xff1a;https://www.bilibili.com/video/BV1Lu4y1t7FG/ 最终的实现效果如下&#xff1a; 前几天刷抖音刷到了玉渊谭天对于电影抽取画面制作“蚊香图”&#xff0c;相关视频片段如下。 这种制作”蚊香图“的特效当时有点触动到到我&#xff0c;根据色彩来分…

深度学习技巧应用30-深度学习中的GPU的基本架构原理与应用技巧

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用30-深度学习中的GPU的基本架构原理与应用技巧,GPU是一种专门用于处理大量并行操作的硬件设备,它的架构设计主要是为了图形渲染。然而,由于其并行处理能力,现在广泛应用于深度学习、科学计算等领域。主要的GPU制造商…

禁用WordPress前台搜索功能

WordPress自带的搜索功能很弱、效率非常低&#xff0c;如果有人利用这个缺陷发起很多搜索请求&#xff0c;你的服务器很有可能会宕机。我们可以使用百度、360等实现站内搜索&#xff0c;并禁止前台使用WordPress自带的搜索功能&#xff0c;在当前主题的 functions.php 文件里加…

Flutter学习(五)安装在gradle debug情况

前文回复 flutter环境配置 链接 背景 有了前文回顾&#xff0c;但是发现有部分的电脑&#xff0c;还是在下载环境的过程中&#xff0c;会卡在gradle builde的情况。所以有了该文章。 原因 配置了fullter的镜像&#xff0c;但是默认使用安卓的gradle变量&#xff0c;还是有…

autojs-练手-简单的视频号点赞(初阶版)

注释很详细&#xff0c;直接上代码&#xff08;简单的练手实践&#xff0c;仅供参考&#xff09; //设置点赞次数 var num50; //等待权限授予 auto.waitFor(); //进入点赞流程 while(num!0) {//先向下滑一个视频scrollDown();//使用auto.js找到点赞控件的id&#xff08;每个人不…

《软件方法》2023版第1章:1.1 利润=需求-设计,1.2 ABCD工作流

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第1章 建模和UML 牵着你走进傍晚的风里&#xff0c;看见万家灯火下面平凡的秘密。 《情歌唱晚》&#xff1b;词&#xff1a;黄群&#xff0c;曲&#xff1a;黄群&#xff0c;唱&#…

复数的几何意义

1、复平面&#xff0c;复数的其它表示法 (1)几何表示法 直角平面坐标&#xff1a; 复平面 实轴&#xff0c;虚轴 (2)向量表示法 向量 模&#xff1a; 复数加减法可用向量的三角形法则或者平行四边形法则 (3)结论 (两边之和大于第三边) ((两边之差大于第三边)) *辐角&am…