来源:力扣(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
}
简洁明了!
今日总结 --- 逆向思维