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。

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