453. 最小操作次数使数组元素相等

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。

示例 1:

输入:nums = [1,2,3] 输出:3 解释: 只需要3次操作(注意每次操作会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

示例 2:

输入:nums = [1,1,1] 输出:0

提示:

n == nums.length 1 <= nums.length <= 105 -109 <= nums[i] <= 109 答案保证符合 32-bit 整数

我的解题思路

刚开始 我直接是想for循环直接解题累加

fun minMoves(array: IntArray, nums: Int = 0): Int {
 var max = 0
 // 可操作次数
 var operable = array.size - 1
 var equal = array.size

 // 首先找到最大值和最小值
 for (index in array.indices) {

 when {
 index == max || operable <= 0 -> {
 operable++
 }

 array[index] > array[max] -> {
 array[max]++
 max = index
 }
 array[index] == array[max] -> {
 equal--
 array[index]++
 }
 else -> {
 array[index]++
 }
 }
 operable--
 }

 return if (equal == 1) {
 return nums
 } else {
 minMoves(array, nums + 1)
 }
}

结果调试时是ok的能通过 但是提交后碰到了[1,100000000]当时直接超时了

后面准备考虑优化算法,想我加貌似每次要移动n-1个数据 是否可以改一下 我直接减呢 减每次只移动一个!!

第二代写法

fun minMoves(array: IntArray): Int {
 val min = array.minOrNull() ?: array[0]
 var res = 0
 for (index in array.indices) {
 res += array[index] - min
 }
 return res
}

简洁明了!

今日总结 --- 逆向思维

你可能感兴趣的:(453. 最小操作次数使数组元素相等)