当前位置: 首页 > news >正文

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

本文涉及知识点

差分数组

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++**实现。

相关文章:

  • 【文末附gpt升级秘笈】AI热潮降温与AGI场景普及的局限性
  • 集合体学习01
  • 写一个标准的项目说明书大纲
  • GitHub工程git merge出现冲突处理方式
  • 接口请求的六种常见方式详解(get、post、head等)
  • C语言:结构体数组
  • FastWeb网站开发之拦截器(interceptor)使用教程
  • 课时151:项目发布_基础知识_技术要点
  • 分布式事务AP控制方案(下)
  • 数据结构之线性表(3)
  • 14. RTCP 协议
  • Kafka的分区副本机制
  • 小熊家务帮day19-day21 订单模块2(取消订单,退款功能等)
  • OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装
  • 类和对象(上续)
  • httpie使用详解
  • java 多线程基础, 我觉得还是有必要看看的
  • React中的“虫洞”——Context
  • spark本地环境的搭建到运行第一个spark程序
  • 解析带emoji和链接的聊天系统消息
  • 力扣(LeetCode)965
  • 前端_面试
  • 深度学习在携程攻略社区的应用
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​ubuntu下安装kvm虚拟机
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​渐进式Web应用PWA的未来
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • $forceUpdate()函数
  • (1)虚拟机的安装与使用,linux系统安装
  • (12)目标检测_SSD基于pytorch搭建代码
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (第27天)Oracle 数据泵转换分区表
  • (过滤器)Filter和(监听器)listener
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)平衡树
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net 8.0 新的变化
  • .NET Core 中的路径问题
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net 按比例显示图片的缩略图
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET企业级应用架构设计系列之结尾篇
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET学习教程二——.net基础定义+VS常用设置
  • @EnableWebSecurity 注解的用途及适用场景
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @Transactional 参数详解
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能