leetcode之Minimum Moves to Equal Array Elements(453)

题目:

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。

示例:

输入:
[1,2,3]

输出:
3

解释:
只需要3次移动(注意每次移动会增加两个元素的值):

[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

python代码1:

class Solution(object):
    def minMoves(self, nums):
        nums.sort()
        c = 0
        for i in range(len(nums)-1,-1,-1):
            if nums[i] == nums[0]:
                break
            c += nums[i] - nums[0]
        return c

python代码2:

class Solution:
    def minMoves(self, nums):
        return sum(nums) - min(nums)*len(nums)

心得:

解法1首先对列表进行排序,nums[0]是最小的元素,nums[-1]是最大的元素,开始让n-1个元素开始+1,但是可以注意到,nums[0]永远是最小的元素,当nums[0]成为最大的元素时,即结束。所以,从最后一位开始向前遍历,当nums[0]成为num[-1]时,除了nums[-1]本身,其他元素都加了1,此时nums[-1]已经不是最大的元素了,最大的元素已经是nums[-2],然后从nums[-2]继续向前遍历,如此反复,得到结果。

解法2是数学推到的结果,首先设最小的元素是min,设最大元素位max,设列表元素的和是sum,列表的长度为n,假设一共移动了i次,于是最终列表的每个元素为min + i,最终列表的和为(min+i)*n,而最终的列表之和也可以等于sum + i*(n-1),之后等号连接这两个式子,得到结果i=sum-min*n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章