每日一题:453. 最小操作次数使数组元素相等

296 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

一、题目描述:

453. 最小操作次数使数组元素相等 - 力扣(LeetCode)

给你一个长度为 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 整数

二、思路分析:

首先我们要理解题意,题目说明要把所有数组中的数字全部变为一样,且每次只能对n-1个数进行加一操作。那么变相的相当于对一个数进行了减一操作,直至将所有数减少到与最小的数相等位置,所以可以进行一次遍历,在遍历期间对数组的数进行求和以及获得最小值。最后用和减去最小值乘以数组的长度便是操作次数。

三、AC 代码:

class Solution {
    public int minMoves(int[] nums) {
        if (nums.length==0)
            return 0;
        if (nums.length==1)
            return 0;
        int sum = 0;
        int min = nums[0];
        for (int i = 0;i<nums.length;i++){
            sum+=nums[i];
            if (nums[i]<min)
                min=nums[i];
        }
        return sum-min*nums.length;
    }
}

范文参考:

思路一:经过分析发现,结果为数组中的每一位数与最小值的差值相累加之后的值, * 执行用时: 1 ms, 在所有 Java 提交中击败了100.00%的用户 * 内存消耗:38.9 MB, 在所有 Java 提交中击败了54.21%的用户。思路二:先排序,然后每一次所有数(出最大数之外)都增加最大数减去最小数的值,并更新数组,然后将每一次增加的数值累加起来即可。*执行用时:2091 ms, 在所有 Java 提交中击败了7.69%的用户 * 内存消耗:38.8 MB , 在所有 J - 最小操作次数使数组元素相等 - 力扣(LeetCode)