【差分数组】1674. 使数组互补的最少操作次数

news2025/1/16 19:03:11

本文涉及知识点

差分数组

LeetCode1674. 使数组互补的最少操作次数

给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit 。每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的另一个整数。
如果对于所有下标 i(下标从 0 开始),nums[i] + nums[n - 1 - i] 都等于同一个数,则数组 nums 是 互补的 。例如,数组 [1,2,3,4] 是互补的,因为对于所有下标 i ,nums[i] + nums[n - 1 - i] = 5 。
返回使数组 互补 的 最少 操作次数。
示例 1:
输入:nums = [1,2,4,3], limit = 4
输出:1
解释:经过 1 次操作,你可以将数组 nums 变成 [1,2,2,3](加粗元素是变更的数字):
nums[0] + nums[3] = 1 + 3 = 4.
nums[1] + nums[2] = 2 + 2 = 4.
nums[2] + nums[1] = 2 + 2 = 4.
nums[3] + nums[0] = 3 + 1 = 4.
对于每个 i ,nums[i] + nums[n-1-i] = 4 ,所以 nums 是互补的。
示例 2:
输入:nums = [1,2,2,1], limit = 2
输出:2
解释:经过 2 次操作,你可以将数组 nums 变成 [2,2,2,2] 。你不能将任何数字变更为 3 ,因为 3 > limit 。
示例 3:
输入:nums = [1,2,1,2], limit = 2
输出:0
解释:nums 已经是互补的。

提示:
n == nums.length
2 <= n <= 105
1 <= nums[i] <= limit <= 105
n 是偶数。

差分数组

无论是否修改,nums[i]的值都 ∈ \in [1,limit],故互补后x1=nums[i],x2 =nums[n-1-i], x =x1 + x2,则x ∈ \in [2,2limit]。
差分数组vDif[i] 记录 x为i的最少操作次数。vDif[0…1]忽略。
枚举i=0 to n/2-1。
分别求解0次操作的范围,1次操作的范围。2次操作的范围
x1+x2 只需要操作一次
[x1+1,x1+limit] [x2+1,x2+limit] 只需要操作一次。重叠部分需要扣掉。
其它需要两次。
先假定所有都需要两次。
一次或0次操作的返回一次。
0次操作的再返回一次。

代码

核心代码

class Solution {
public:
	int minMoves(vector<int>& nums, int limit) {
		const int n = nums.size();
		vector<int> vDiff(limit * 2 + 2);
		auto Add = [&](int left, int right, int num) {
			vDiff[left] += num;
			vDiff[right + 1] -= num;
		};
		Add(2, limit * 2,n);
		for (int i = 0; i < n / 2; i++) {
			const int x1 = nums[i];
			const int x2 = nums[n - 1 - i];
			Add(x1 + 1, x1 + limit,-1);
			Add(x2 + 1, x2 + limit, -1);
			const int l1 = max(x1 + 1, x2 + 1);
			const int r1 = min(x1 + limit , x2 + limit );
			if (r1 >= l1) {
				Add(l1, r1,1);
			}
			Add(x1 + x2, x1 + x2, -1);
		}
		int sum = 0;
		int ret = n;
		for (int i = 2; i <= 2 * limit; i++) {
			sum += vDiff[i];
			ret = min(ret, sum);
		}
		return ret;
	}
};

测试用例

template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{
	Assert::AreEqual(t1 , t2);
}

template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{
	Assert::AreEqual(v1.size(), v2.size());	
	for (int i = 0; i < v1.size(); i++)
	{
		Assert::AreEqual(v1[i], v2[i]);
	}
}

template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{
	sort(vv1.begin(), vv1.end());
	sort(vv2.begin(), vv2.end());
	Assert::AreEqual(vv1.size(), vv2.size());
	for (int i = 0; i < vv1.size(); i++)
	{
		AssertEx(vv1[i], vv2[i]);
	}
}

namespace UnitTest
{
	vector<int> nums;
	int limit;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod0)
		{
			nums = { 1, 2, 4, 3 }, limit = 4;
			auto res = Solution().minMoves(nums, limit);
			AssertEx(1 ,res);
		}
		TEST_METHOD(TestMethod1)
		{
			nums = { 1,2,2,1 }, limit = 2;
			auto res = Solution().minMoves(nums, limit);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod2)
		{
			nums = { 1,2,1,2 }, limit = 2;
			auto res = Solution().minMoves(nums, limit);
			AssertEx(0, res);
		}
	};
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

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

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

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

相关文章

reverse入门刷题(6.9)

总结&#xff1a; 拿到附件&#xff0c;先运行看看有没有信息&#xff0c;再查壳&#xff0c;再IDA运行 1.Easy_vb 收获&#xff1a; 使用搜索&#xff1a;在String的时候用的是ctrlf 在IDA_view的时候使用搜索是Aitt 打开IDA&#xff0c;Aitt搜索MCTF&#xff08;关键字即…

2024年6月最新开源电视影视TVAPP原生源码和后台管理平台源码及完整教程

本套源码为本人维护更新完善半年左右的还在使用开发的源码&#xff0c;与市面上倒卖的残次品不一样&#xff0c;没有可比性&#xff0c;向下兼容安卓4.0&#xff0c;向上兼容安卓13以上TV电视系统&#xff0c; 完全无闪退&#xff0c;弹窗报错&#xff0c;卡死、异常死循环残次…

加解密算法及国密算法应用

常见的加解密算法可以分为可逆和不可逆两种 不可逆算法 哈希算法&#xff0c;MD5&#xff0c;hs-256&#xff0c;SM3 一般系统中使用密码加密和数据防篡改校验字段就是不可逆算法 hs-256应用&#xff1a;JWT header头部payload荷载signature签名(防止篡改) 前两部分采用base…

数组双指针经典习题

合并两个有序数组 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1m-1,p2n-1;int p3nums1.length-1;while(p1>0&&p2>0){//放完一个数组if(nums1[p1]>nums2[p2]){nums1[p3--]nums1[p1];p1--;}else{nums1[p3--]nums2[p2];p…

微服务Day7学习-数据聚合、同步、补全

文章目录 数据聚合聚合分类 自动补全DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合多条件聚合对接前端接口拼音分词器自定义分词器自动补全查询实现酒店搜索框自动补全 数据同步数据同步思路分析利用mq实现mysql与elasticsearch数据同步 集群介绍搭建ES集群 数据聚合 聚…

搭建vauditdemo靶场mysql为NO问题

一、问题 在搭建vauditdemo时&#xff0c;遇到如下显示问题&#xff1a; mysql版本检测为NO 二、解决 查找该方面问题时&#xff0c;并没有找到解决方法 然后换mysql版本换了五六个也没有解决问题 问了AI后给的答复有一条为将mysql改为mysqli 修改保存后解决问题 步骤如…

力扣 T62 不同路径

题目 连接 思路 思路1 &#xff1a; BFS爆搜 class Solution { public:queue<pair<int,int>>q;int uniquePaths(int m, int n) {q.push({1,1}); // 起始位置vector<pair<int, int>> actions;actions.push_back({0, 1}); // 向下actions.push_bac…

OBS 录屏软件:录制圆形头像画中画,设置卡通人像(保姆级教程,有步骤图,建议收藏)

Mac分享吧 文章目录 一、OBS录屏软件 圆形头像画中画效果注意&#xff1a;圆形画中画仅需要在软件中设置一次&#xff0c;每次录制&#xff0c;使用带有圆形头像画中画的场景 录制视频即可。该场景不可删除&#xff01;&#xff01;&#xff01;若删除&#xff0c;则需要重新设…

Vue3学习日记(day2)

目录 前言 注意事项 vite使用 1&#xff1a;控制台vite创建vue 2&#xff1a;使用可视化软件&#xff08;我使用为vscode&#xff09;npm安装对应依赖包 3&#xff1a;使用npm脚本或者直接在终端输入命令运行软件后打开生成网址 4&#xff1a;打开网址正常进入网页 rou…

【漏洞复现】飞企互联-FE企业运营管理平台 treeXml.jsp SQL注入漏洞

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外&#xff0c;支持企业B2B、C2B与020等核心需求&#xff0c;为不同行业客户的互联网转型提供支持。其特色在于提供…

限流(服务降级):基于自定义注解+切面的方式实现接口调用频率限制

文章目录 引言I 基于GuavaCache实现频率限制1.1 基于LoadingCache实现(灵活控制,高效率)【推荐】1.2 基于LoadingCache自定义RateLimiter (无法灵活控制限制时间范围)1.3 基于google的RateLimiter实现(效率低)II 基于Redis实现限流引言 背景:提供接口给下游(外部厂商)…

DeepSpeed Huggingface模型的自动Tensor并行、kernel注入、训练阶段的优化版kernel

推理阶段。 在后台&#xff0c;1. DeepSpeed会把运行高性能kernel(kernel injection)&#xff0c;加快推理速度&#xff0c;这些对用户是透明的&#xff1b; 2. DeepSpeed会根据mp_size来将模型放置在多个GPU卡上&#xff0c;自动模型并行&#xff1b; import os import torch …

Mysql学习(八)——多表查询

文章目录 五、多表查询5.1 多表关系5.2 多表查询概述5.3 内连接5.4 外连接5.5 自连接5.6 联合查询5.7子查询5.8 总结 五、多表查询 5.1 多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;…

freertos源码分析DAY2 (消息队列 )

目录 1. 队列原理 1.1 顺序队列操作 1.2 循环队列操作 2.消息队列原理 2.1消息队列的构成 2.2 消息队列出入队原则 2.3 消息队列发送/接收消息原理 2.4 队列锁机制 3. 消息队列创建及删除 3.1 创建消息队列函数 3.1.1 xQueueGenericCreate通用任务创建函数 3.1.1.1 …

人工智能在医学领域的应用及技术实现

欢迎来到 Papicatch的博客 目录 &#x1f349;引言 &#x1f349; 医学影像分析 &#x1f348;技术实现 &#x1f34d;数据准备 &#x1f34d;模型构建 &#x1f34d;模型训练 &#x1f34d;模型评估 &#x1f34d;应用部署 &#x1f348;示例代码 &#x1f349; 基因…

简单动态字符串SDS

简单动态字符串&#xff08;simple dynamic string&#xff09;: redis虽然说是用C语言重写的&#xff0c;但它也进行了一些创新&#xff0c;自己构建了简单动态字符串SDS&#xff0c;从名字也看得出来有别于以空字符结尾的字符数组&#xff08;C字符串&#xff09; reids中只…

谷歌AI助力软件工程的进展及未来展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【教学类-64-03】20240611色块眼力挑战(三)-2-10宫格色差10-50(10倍)适合中班幼儿园(星火讯飞)

背景需求&#xff1a; 【教学类-64-02】20240610色块眼力挑战&#xff08;二&#xff09;-2-25宫格&色差10-100&#xff08;10倍&#xff09;&#xff08;星火讯飞&#xff09;-CSDN博客文章浏览阅读360次&#xff0c;点赞17次&#xff0c;收藏13次。【教学类-64-02】2024…

34、matlab输入命令汇总

1、ans:最近计算的答案 代码示例1 12ans 3 代码示例2 Brand(7)B 列 1 至 60.7060 0.3171 0.1869 0.6797 0.5853 0.95930.0318 0.9502 0.4898 0.6551 0.2238 0.54720.2769 0.0344 0.4456 0.1626 0.7513 0.13860.0462 0.4387…

[大模型]GLM4-9B-chat Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 LLaMA3-8B-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#xff0c…