【C++ 前缀和 数论】1590. 使数组和能被 P 整除|2038

news2024/10/1 18:56:31

本文涉及的基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频
质数、最大公约数、菲蜀定理

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

给你一个正整数数组 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
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= p <= 109

前缀和

N = nums.size()
由于是对p求余,所以求前缀和的时候直接对p求余。
如果nums的和能被p整除则返回0。否则令p1 = sum(num)%p ;
假定nums[i…j]被删除,枚举j。令preSum[j+1]为p2。则在preSum[0…j]中求值为 (p1-p2+p)%p 的下标i,如果有多个符合的下标取最大下标。ret = j-i+1的最小值,如果ret == n,返回-1,否则返回ret。
mValueIndex 的key:preSum[i]的值,value:i。

代码

前缀和

class Solution {
		public:
			int minSubarray(vector<int>& nums, int p) {
				const int N = nums.size();
				vector<int> preSum(1);
				for (const auto& n : nums) {
					preSum.emplace_back((n + preSum.back()) % p);
				}
				const int p1 = preSum.back() % p;
				if (0 == p1) { return 0; }
				unordered_map<int, int> mValueIndex;
				int ret = N;
				for (int j = 0; j < N; j++) {
					mValueIndex[preSum[j]] = j;
					const int p3 = (preSum[j + 1] - p1 + p) % p;
					if (mValueIndex.count(p3)) {
						ret = min(ret, j + 1 - mValueIndex[p3]);
					}
				}
				return (N == ret) ? -1 : ret;
			}
		};

单元测试

vector<int> nums;
		int p;
		TEST_METHOD(TestMethod11)
		{
			nums = { 3, 1, 4, 2 }, p = 6;
			auto res = Solution().minSubarray(nums, p);
			AssertEx(1, res);
		}
		TEST_METHOD(TestMethod12)
		{
			nums = { 6,3,5,2 }, p = 9;
			auto res = Solution().minSubarray(nums, p);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod13)
		{
			nums = { 1,2,3 }, p = 3;
			auto res = Solution().minSubarray(nums, p);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod14)
		{
			nums = { 1,2,3 }, p = 7;
			auto res = Solution().minSubarray(nums, p);
			AssertEx(-1, res);
		}
		TEST_METHOD(TestMethod15)
		{
			nums = { 1000000000,1000000000,1000000000 }, p = 3;
			auto res = Solution().minSubarray(nums, p);
			AssertEx(0, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

麒麟系统文件扩展名所表示的文件种类

图 1 .conf 配置文件&#xff0c;如图2&#xff1b; 图 2 .Deb 安装包&#xff0c;如图3&#xff1b; 图 3 .sh 可执行程序&#xff0c;如图4&#xff1b; 图 4 .tar或者.gz 压缩包&#xff0c;如图5&#xff1b; 图 5 .bin 二进制文件&#xff0c;如图6&#xff1b; 图 6…

android compose ScrollableTabRow indicator 指示器设置宽度

.requiredWidth(30.dp) Box(modifier Modifier.background(Color.LightGray).fillMaxWidth()) {ScrollableTabRow(selectedTabIndex selectedTabIndex, // 默认选中第一个标签containerColor ColorPageBg,edgePadding 1.dp, // 内容与边缘的距离indicator { tabPositions…

房地产政策持续利好,龙湖“好房子”新品观萃入市受市场认可

《港湾商业观察》王璐 经过疫情以来持续调整的房地产市场&#xff0c;外界预期&#xff0c;在政策利好效应带动下&#xff0c;行业将稳健向前。 9月26日&#xff0c;中央政治局会议对房地产的表述内容释放出极强的政策宽松信号。会议首次明确提出&#xff0c;“要促进房地产市…

解决QWidget及内部控件只能放大不能缩小的问题

在设计可缩放控件的时候&#xff0c;你可能会与到这种情况&#xff1a; 缩放 控件只能放大&#xff0c;不能缩小。。。是不是很头痛&#xff1f;让我来猜猜原因&#xff1a;你是不是让子类控件的大小设置地跟父类控件大小一样大&#xff1f;没错这就是原因所在。 用上面一行替换…

pdf怎么盖章不覆盖文字

pdf怎么盖章不覆盖文字&#xff1f;在PDF上盖章而不覆盖文字&#xff0c;可以按照以下步骤操作&#xff1a; 使用福昕PDF编辑器 下载安装&#xff1a;从福昕软件官网下载并安装福昕PDF编辑器。打开文档&#xff1a;用福昕PDF编辑器打开需要盖章的PDF文档。访问图章工具&#…

[网络]抓包工具介绍 tcpdump

一、tcpdump tcpdump是一款基于命令行的网络抓包工具&#xff0c;可以捕获并分析传输到和从网络接口流入和流出的数据包。 1.1 安装 tcpdump 通常已经预装在大多数 Linux 发行版中。如果没有安装&#xff0c;可以使用包管理器 进行安装。例如 Ubuntu&#xff0c;可以使用以下…

Ps:将画板导出到 PDF

菜单&#xff1a;文件/导出/将画板导出到 PDF Export/Artboards to PDF 将画板导出到 PDF Artboards to PDF命令用于将 Photoshop 的画板导出为 PDF 文件&#xff0c;提供了多种导出选项&#xff0c;可以控制文件的压缩、是否嵌入颜色配置文件、文件命名以及页面顺序等。它适用…

电力、电子、电气、电器,怎么说明白?

从学科划分的角度讲 电力、电子和电器都属于电气工程学科。电气工程一词来源于日本&#xff0c;其中的“气”来源于西方外文翻译&#xff08;西方工业之初&#xff0c;动力机械均由蒸汽轮机驱动,后来用与发电&#xff0c;故"电气"开始乏指工业动力&#xff0c;现在电…

高效便捷,体验不一样的韩语翻译神器

嘿&#xff0c;大家好啊&#xff01;今天想跟大家聊聊我用过的几款翻译神器&#xff0c;特别是它们在翻译韩语时的那些小感受。作为一个偶尔需要啃啃韩语资料或者跟韩国朋友聊天的普通人&#xff0c;我真心觉得这些翻译工具简直就是我的救星&#xff01; 一、福昕在线翻译 网址…

Unity网络开发记录(五):二进制传输消息类

消息类 前篇所写的CS模型只能传输字符串&#xff0c;在本篇文章中&#xff0c;尝试在服务端一次传输多种类型的数据&#xff0c;并在客户端接收到信息之后进行解析显示 为了实现对不同类型的数据传输&#xff0c;需要将不同类型的数据都转换成二进制的形式在网络中进行传输。所…

爬虫——爬虫理论+request模块

一、爬虫理论 爬虫——请求网站并提取数据的自动化程序 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟客户端发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;自动的抓取互联网信息的程序。 原则上&…

通信工程学习:什么是HTTP超文本传输协议

HTTP&#xff1a;超文本传输协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;即超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议&#xff0c;它位于TCP/IP四层模型当中的应用层。以下是关于HTTP协议的详细解释&#xff1a; 一、H…

太速科技-495-定制化仪器户外便携式手提触摸一体机

定制化仪器户外便携式手提触摸一体机 一、产品简介 数据处理便携式机箱平台以mini-ITX主板为基础&#xff0c;集成intel CPU处理器、FPGA、ADDA、光纤等接口&#xff0c;集成触摸显示屏&#xff0c;抗震机箱。设备小型化、一体化&#xff0c;适合实验室、办公桌面、野外…

Cannon-es.js之removeConstraint破坏约束案例

本文目录 前言最终效果1、postStep2、前置准备2.1 代码2.2 效果 3、removeConstraint3.1 解除约束代码效果 4、完整代码 前言 在3D物理引擎的广阔天地中&#xff0c;cannon-es以其轻量级、高性能和易于集成的特点&#xff0c;成为了WebGL环境中物理模拟的首选工具。它不仅能够精…

基于R语言机器学习遥感数据处理与模型空间预测

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

在海量文档中找资料?5 步打造属于自己的搜索引擎

在海量的文件中寻找那个关键的会议记录&#xff0c;是否让你感到头疼&#xff1f; 想要快速回顾上个月的项目报告&#xff0c;却迷失了一小时都找不到&#xff1f; 找报价、找库存、找供应商&#xff0c;整天忙于各种找找找&#xff1f; 现在就来教大家如何做属于自己的搜索引…

分治法c++

分治法c 快速幂题目算法代码 大整数乘法题目思路代码 快速幂 题目 三个整数 a、b 和 m&#xff0c;计算 a 的 b 次幂对 m 取模的结果ab ac abc(ab)|m(a|mb|m)|m。|为数学中的求模运算符&#xff0c;相当于c语言中的%。(ab)|m(a|mb|m)|m 算法 二分法求幂。先求ab的一半&…

【算法竞赛】尺取法

尺取法(又称为双指针、Two Pointers)是算法竞赛中一个常)用的优化技巧,用来解决序列的区间问题,操作简单,容易编程。如果区间是单调的,也常常用二分法求解,所以很多问题用尺取法和二分法都行。另外,尺取法的操作过程和分治算法的步骤很相似,有时也用在分治中。 概念 什么是尺…

位运算(4)_丢失的数字

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 位运算(4)_丢失的数字 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示:…

学习VTK的目的和方法

1 VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的跨平台软件系统&#xff0c;用于三维计算机图形学、图像处理和可视化。学习VTK的主要目的有&#xff1a; 3D可视化&#xff1a; VTK提供了丰富的工具和算法&#xff0c;可以用来可视化各种科学数据&#xff0c…