【leetcode刷題】T202-最少移動次數使數組元素相等 II

木又連續日更第68天(68/100)html



木又的第202篇leetcode解題報告python

數學類型第18篇解題報告c++

leetcode第462題:最少移動次數使數組元素相等 IIweb

https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements-ii/數組



【題目】微信

給定一個非空整數數組,找到使全部數組元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。您能夠假設數組的長度最多爲10000。app

例如:
輸入:
[1,2,3]
輸出:
2
說明:
只有兩個動做是必要的(記得每一步僅可以使其中一個元素加1或減1): 
[1,2,3]  =>  [2,2,3]  =>  [2,2,2]

【思路】ui

能想出這道題數學解法的人很牛逼!spa

很明顯,咱們應該找數組中間的某個數,而後計算移動步驟。.net

咱們首先想到是平均數,不過好像不對,平均數極可能不是整數,須要處理;另外,好像結果並非最小值。

其實,咱們就是求解:min(abs(nums[0] - x) + abs(nums[1] - x) +… + abs(nums[n-1] - x))

那麼,x應該是中位數。(我也不知道怎麼解出來的【笑哭】)

咱們能夠從中位數推出最小值:

假設數組元素個數是奇數2n+1,那麼大於中位數的有n個,這些數移動到中位數須要x步;小於中位數的有n個,這些數移動到中位數須要y步。那麼總的移動步數爲x+y步。若是不是中位數,好比中位數-1,那麼大於中位數的,須要移動x+n步,小於中位數的,至少須要移動y-n步(有的數可能大於中位數-1),總的步數大於x+y步

假設數組元素個數是偶數,只要是兩個中位數之間的數,均可以做爲移動後的值。由於,若是小於中位數m1的數所有移動到m1,大於中位數m2(m2>=m1)的數所有移動到買m2,那麼只要目標值在m1->m2之間,總的移動步數是肯定的。

【代碼】

python版本

class Solution(object):
    def minMoves2(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        nums.sort()
        target = nums[len(nums) // 2]
        return sum(map(lambda x: abs(x - target), nums))

C++版本

class Solution {
public:
    int minMoves2(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int target = nums[nums.size() / 2];
        int sum = 0;
        for (auto n : nums){
            sum += abs(n - target);
        }
        return sum;
    }
};


前一篇文章:T201-最小移動次數使數組元素相等


給我好看


本文分享自微信公衆號 - 木又AI幫(gh_eaa31cab4b91)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索