携手创作,共同成长!这是我参与「掘金日新计划 · 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
总结
看清本质还是个贪心