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

【晓龙oba出品 - 黑科技解题系列】- 最小操作次数使数组元素相等

思路

算法归根到底就是找规律的游戏,我们首先来看一个现象:
以数组nums =[1,2,3,4,5]为例
当我们将数组排序后,可以知道最小值为1,最大值为5,此时我们需要四次运算可以使最小值与最大值相等:
第一次:2,3,4,5,5
第二次:3,4,5,6,5
第三次:4,5,6,7,5
第四次:5,6,7,8,5
运算次数 = 最大值 - 最小值

这时我们观察: 经过四次累加,nums = [5,6,7,8,5],这时之前数组的最大值已经等于数组的最小值,因此我们将数组排序后会得到 nums = [5,5,6,7,8],我们重复上面的步骤,继续进行数组累加:
第一次: 6,6,7,8,8
第二次: 7,7,8,9,8
第三次: 8,8,9,10,8
运算次数 = 最大值 - 最小值

我们到这里可以总结出第一个规律:
每一轮我们使最小值等于最大值的运算次数等于数组中最大值与最小值的差值。

然后我们观察下在排序前的数组numsOld = [5,5,6,7,8] 和 numsNew = [8,8,9,10,8]可以发现虽然我们的最小值在增加的过程中向最大值趋近,但是此时次大值同样的以相同的数值进行累加成为了最新的最大值,当完成一轮加法运算后,原本的最大值就会变成最小值,次大值就会变成最大值,而我们只需要根据这个规律,就不需要重复的进行加法运算。

我们只需要从最大值开始统计每一轮使最小值与最大值相等的次数即可。
好了,让我们看代码:

    private static int minMoves(int[] nums) {int times = 0;Arrays.sort(nums);// 判断if (nums.length == 1 || nums[nums.length - 1] == nums[0]) {return times;}// 开启循环for (int i = nums.length - 1; i >= 0; i--) {times += nums[i] - nums[0] > 0 ? nums[i] - nums[0] : 0;}return times;}

运行结果:
image.png{:width=400}

http://www.lryc.cn/news/35644.html

相关文章:

  • Activity的启动和结束
  • 利用业务逻辑+OB分布式特性优化SQL
  • 哈希表
  • 基于Halcon的MLP(多层感知神经网络)分类器分类操作实例
  • VR全景博物馆,打造7*24小时的线上参访体验
  • Go 数据类型
  • Mybatis-Plus学透?一篇足够(持续更新中)
  • 船用燃料油市场调研报告-主要企业、市场规模、份额及发展趋势
  • python趣味编程-奥赛罗游戏
  • 经典卷积模型回顾13—ResNetXt实现图像分类(matlab)
  • Spring学习——Maven进阶
  • 第23篇:基础知识-Java Switch Case
  • Go 实现多态和 参数的动态个数及动态类型
  • vue 指令
  • APP违法违规收集使用个人信息合规评流程和范围
  • 【力扣2379】 得到 K 个黑块的最少涂色次数(c++100%)
  • [2.2.2]进程调度的时机、方式、切换与过程
  • 第24篇:Java包装类知识深度分析
  • 常见问题整理1
  • 体验Linux 块设备驱动实验(模拟块)
  • 一文搞懂Linux时区设置、自定义时区文件
  • Java实例实验项目大全源码企业通讯打印系统计划酒店图书学生管理进销存商城门户网站五子棋
  • 基于nvidia xavier智能车辆自动驾驶域控制器设计与实现-百度Apollo架构(二)
  • 考研408 王道计算机考研 (初试/复试) 网课笔记总结
  • [Java·算法·中等]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置
  • SAP BTEs的简介及实现
  • 如何利用海外主机服务提高网站速度?
  • 【SpringMVC】 一文掌握 》》》 @RequestMapping注解
  • 高三应该怎么复习
  • 如何通过C++ 将数据写入 Excel 工作表