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

2366. 将数组排序的最少替换次数

2366. 将数组排序的最少替换次数

给你一个下表从 0 开始的整数数组 nums 。每次操作中,你可以将数组中任何一个元素替换为 任意两个 和为该元素的数字。

比方说,nums = [5,6,7] 。一次操作中,我们可以将 nums[1] 替换成 2 和 4将 nums 转变成 [5,2,4,7]
请你执行上述操作,将数组变成元素按 非递减 顺序排列的数组,并返回所需的最少操作次数。

示例 1:

输入:nums = [3,9,3]
输出:2
解释:以下是将数组变成非递减顺序的步骤:

  • [3,9,3] ,将9 变成 3 和 6 ,得到数组 [3,3,6,3]
  • [3,3,6,3] ,将 6 变成 3 和 3 ,得到数组 [3,3,3,3,3] 总共需要 2 步将数组变成非递减有序,所以我们返回 2 。

示例 2:

输入:nums = [1,2,3,4,5]
输出:0
解释:数组已经是非递减顺序,所以我们返回 0 。

提示:

1 <= nums.length <= 1e5
1 <= nums[i] <= 1e9

解析:

  • 使用倒序+贪心策略
  • 为什么使用倒序?因为最后一个数一定肯定不会分解,并且前一个数是否分解、最少分解几次可以根据后一个数决定。
  • 例如:3 9 3;3一定不会分解,9由于大于3需要分解,需要分解几次就需要贪心策略了。
  • 我们想要的是分解的次数尽量小,同时还要保证分解之后最前边一个数尽量大。
  • 例如:28 9–>分解为 7 7 7 7 9肯定是优于5 5 9 9 9的,次数一样,7>5
  • 贪心来了,我们可以枚举分解次数,
  • 假如分解一次28/2=14,最大值>9不行;
  • 分解2次28/3=9…1,肯定有个数为10也不行;
  • 分解3次,28/4=7,可以;
  • 因此,可以枚举最大次数来确定答案。同样可以证明分解四次优于分解五次,分解五次数小了,次数多了。肯定分解四次最优。
  • 难道我们要从1开始枚举吗?其实是不需要的,可以从nums[i]/nums[i+1]开始枚举,最少次数就是max(nums[i]/nums[i+1],1).
class Solution {
    typedef long long ll;
public:
    // 倒序:最后一个数肯定不用分解。贪心保证后边尽量大
    long long minimumReplacement(vector<int>& nums) {
        ll res=0;
        int n=nums.size();
        for(int i=n-2;i>=0;i--){
            if(nums[i]>nums[i+1]){
            	// 这里cnt表示的是分解之后数的个数,也就是cnt=分解次数+1
            	// 最少分解次数为1
                int cnt=max(nums[i]/nums[i+1],2);
                // 枚举分解次数(这里应该可以用二分枚举)
                // 30/4=7...2;最大值为8,30-->7 7 7+1 7+1相当于将2补给后边两个7
                while(true){
                    if((nums[i]/cnt+(nums[i]%cnt==0?0:1))<=nums[i+1])
                        break;
                    else 
                        cnt++;
                }
                res+=cnt-1;
                // 更新当前位置的值
                nums[i]=nums[i]/cnt;
            }
        }
        return res;
    }
};

相关文章:

  • 牛客 NC26257 小雨坐地铁
  • 基于springboot+vue+elementui的游戏攻略分享平台
  • 【设计模式】Java设计模式 - 模板模式
  • 【C++之数组与指针2】利用指针对数组求和
  • NOIP 2013 普及组初赛试题
  • 【C语言】如何理解多级指针?
  • 【golang】sorter 的两种实现方式
  • 2022.9.2 OpenCV课程群思考题
  • 408王道操作系统强化——文件管理及大题解构
  • 【MyBatis笔记10】Mybatis中几个动态SQL标签和内置参数
  • 7.Nodejs新特性async和await的使用
  • 怎么安装一个简单的vue3.0框架。整个流程.::
  • 【延展Extension Objective-C语言】
  • IDA* AcWing 181. 回转游戏
  • Web3小知识集锦
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • docker容器内的网络抓包
  • ES6 学习笔记(一)let,const和解构赋值
  • iOS 颜色设置看我就够了
  • JavaScript设计模式与开发实践系列之策略模式
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • k8s 面向应用开发者的基础命令
  • leetcode98. Validate Binary Search Tree
  • Linux下的乱码问题
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 高度不固定时垂直居中
  • 给Prometheus造假数据的方法
  • 基于游标的分页接口实现
  • 将回调地狱按在地上摩擦的Promise
  • 力扣(LeetCode)56
  • 微信小程序实战练习(仿五洲到家微信版)
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原生js练习题---第五课
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Apache SeaTunnel 究竟是什么?
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (12)Linux 常见的三种进程状态
  • (175)FPGA门控时钟技术
  • (6)添加vue-cookie
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)鸿鹄云架构一服务注册中心
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)视频码率,帧率和分辨率的联系与区别
  • *1 计算机基础和操作系统基础及几大协议
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET CLR Hosting 简介
  • .net 简单实现MD5
  • .net 流——流的类型体系简单介绍