1. 程式人生 > >leetcode陣列--最少移動次數使陣列元素相等

leetcode陣列--最少移動次數使陣列元素相等

題目

給定一個長度為 n 的非空整數陣列,找到讓陣列所有元素相等的最小移動次數。每次移動可以使 n - 1 個元素增加 1。
示例:
輸入:
[1,2,3]
輸出:
3
解釋:
只需要3次移動(注意每次移動會增加兩個元素的值):

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

思路

一開始自己對其理解有偏差,所有的數與最大的數比較,每一次用最小的數加一直到等於最大的數,從網上看到可以逆向思維,用所有元素之和減去最小值與長度的乘積。

程式碼

class Solution(object):
    def minMoves
(self, nums): """ :type nums: List[int] :rtype: int """ return sum(nums)-min(nums)*len(nums)

題目二

給定一個非空整數陣列,找到使所有陣列元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。 您可以假設陣列的長度最多為10000。
例如:
輸入:
[1,2,3]
輸出:
2
說明:
只有兩個動作是必要的(記得每一步僅可使其中一個元素加1或減1):
[1,2,3] => [2,2,3] => [2,2,2]

思路

先對陣列進行排序,然後找到中位數,所有數與中位數之差的和,就為移動步數

程式碼

class Solution(object):
    def minMoves2(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        mid = len(nums)//2
        res =0
        for n in nums:
            res +=abs(n-nums[mid])
        return
res