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

力扣3224.使差值相等的最少数组改动次数

力扣3224.使差值相等的最少数组改动次数

枚举法

  • 枚举差值x的数值,max(q,k-p)为修改一个能得到的上限

    • 用cnt存qp差值,cnt2存差值上限
    • 有cnt[x]对无需修改
    • n/2 - cnt[x]对至少修改一个
    • cnt2[0] + cnt[1] + … + cnt2[x-1]需要再修改一个
    • 设sum2 = cnt2[0] + cnt[1] + … + cnt2[x-1]
    • 因此ans = n/2 - cnt[x] + sum2
  •   class Solution {public:int minChanges(vector<int>& nums, int k) {vector<int> cnt(k+1),cnt2(k+1);int n = nums.size();for(int i=0;i<n/2;i++){int p = nums[i],q = nums[n-i-1];if(p > q)swap(p,q);cnt[q-p] ++;cnt2[max(q,k-p)] ++;}int ans = n;int sum2 = 0;for(int x=0;x<=k;x++){ans = min(ans,n/2 - cnt[x] + sum2);sum2 += cnt2[x];}return ans;}};
    

差分数组

  • 对于每一对(q,p),求出差值x和最大可实现差值mx

    • 他对差值x的贡献为**(0,x-1)修改一次,x不修改,(x+1,mx)修改一次,(mx,k)修改两次**
    • 因此考虑差分数组存每种差值x情况需要修改的次数
  •   class Solution {public:int minChanges(vector<int>& nums, int k) {vector<int> d(k+2);int n = nums.size();for(int i=0;i<n/2;i++){int p = nums[i],q = nums[n-i-1];if(p > q)swap(p,q);int x = q - p;int mx = max(q,k - p);//[0,x-1]改一次d[0] ++;d[x] --;//[x,mx]改一次d[x+1] ++;d[mx + 1] --;//[mx,k]改两次d[mx + 1] += 2;}//求前缀和for(int i=0;i<d.size()-1;i++)d[i+1] += d[i];return ranges::min(d);}};
    

http://www.mrgr.cn/news/13228.html

相关文章:

  • ZooKeeper 的特性及其在分布式系统中的锁应用
  • FFmpeg源码:avio_read函数分析
  • 谷粒商城实战笔记-问题记录-Feign远程调用丢失请求头问题
  • 提升学术论文质量的智能助手:ChatGPT
  • 自动化常用元素定位
  • 找到K个最接近的元素(LeetCode)
  • 自动化分支合并:一键切换到Master并完成合并操作的脚本
  • C++——STL——栈(stack)
  • Go语言开发通过本地数据xdb文件​查询获取IP地址的归属地区及运营商名称
  • CSS中的Flexbox布局和Grid布局有什么区别?适用场景
  • WPF—画刷(使用画刷实现背景颜色渐变效果)
  • C语言—字符函数和字符串函数
  • 基于SpringBoot+Vue+MySQL的小区物业管理系统
  • YarnClient发送和接收请求源码解析
  • 如何使用ssm实现基于SSM的在线教育网站的设计与实现+vue
  • 基于SSM+小程序的垃圾分类管理系统(垃圾2)(源码+sql脚本+视频导入教程+文档)
  • Java:Calendar类
  • 【区块链 + 司法存证】区块链电子数据存证平台 | FISCO BCOS应用案例
  • 【NO.11】LeetCode经典150题-274. H 指数
  • C++/Qt 多媒体(续二)