题目: https://leetcode.com/problems/minimum-moves-to-equal-array-elements/
难度 : Easy
思路:
naive TLE 代码:
每次都是给并不是最大的元素加1直到全部相等。
class Solution(object):
def minMoves(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = 0
while(not all(x == nums[0] for x in nums)):
nums.sort()
for i in range(len(nums) - 1):
nums[i] += 1
res += 1
return res
给的测试例子是 [1,2147483647]
能不TLE么?tag 是Math,所以要用观察到的结果来做吧?
所以就是每个和最小值来比,看到底要增加多少,这是观察,但不是证明
AC代码
class Solution(object):
def minMoves(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = 0
minVal = min(nums)
for num in nums:
res += num -minVal
return res
类证明:
其实给n-1个数字加1,效果等同于给那个未被选中的数字减1,比如数组[1,2,3], 给除去最大值的其他数字加1,变为[2,3,3],我们全体减1,并不影响数字间相对差异,变为[1,2,2],这个结果其实就是原始数组的最大值3自减1,那么问题也可能转化为,将所有数字都减小到最小值,这样难度就大大降低了,我们只要先找到最小值,然后累加每个数跟最小值之间的差值即可