美文网首页
453. 最小操作次数使数组元素相等

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

作者: 欢乐的饲养员 | 来源:发表于2021-10-20 11:48 被阅读0次

    来源:力扣(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. 最小操作次数使数组元素相等

          本文链接:https://www.haomeiwen.com/subject/zvrtaltx.html