leetcode笔记之[453. 最小操作次数使数组元素相等]

101 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

题目描述

原题链接 :

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

给你一个长度为 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 <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • 答案保证符合 32-bit 整数

思路分析

关键是要想到应该怎么做才能最快达到目标。这里本质上是贪心。

先对数组进行排序,现在假设 x<y<z,

  • 首先放弃最大的 z, 提升 x,y, +(z-x) 到达 z < y+z-x > z。 当做完这一步之后必然有两个元素已经同步了。
  • 现在 y+z-x 是最大的,需要放弃,并提升两个 z 使其达到这么大, +(y-x)。 当做完这一步后,3个元素同步了。 假设 x< y < z < w, 一样同理推导。

最终结果是 (w-x) + (z-x) + (y-x) + (x-x)

看了官方题解的数学法,这里也许更本不需要排序只需要找到最小值即可。

数学法 考虑相对大小,n-1 个数加 1, 相当于是某一个数减 1。那么,需要多少次对某一个数进行 -1 操作,能够达到所有数相同?

sum(A) - n*min(A)

AC 代码

class Solution:
    def minMoves(self, nums: List[int]) -> int:
        nums.sort()
        result = 0
        for x in nums:
            result += x-nums[0]
        return result

总结

看清本质还是个贪心

参考

53. 最小操作次数使数组元素相等普通实现 - 最小操作次数使数组元素相等 - 力扣(LeetCode)

【Nick】每天进来理解(卷)一点点~ - 最小操作次数使数组元素相等 - 力扣(LeetCode)