Minimum Moves to Equal Array Elements 最小移動次數使陣列元素相等

麥田裡的哈士奇發表於2018-11-14

給定一個長度為 n 的非空整數陣列,找到讓陣列所有元素相等的最小移動次數。每次移動可以使 n - 1 個元素增加 1。

示例:

輸入:
[1,2,3]

輸出:
3

解釋:
只需要3次移動(注意每次移動會增加兩個元素的值):

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

思路:這是一道純數學問題,假設陣列總和為sum,最小值為min_number,那麼滿足如下等式:

sum+m*(n-1)=n*x       //其中x為最終相等的值,n為陣列的長度,m是移動的次數

由於觀察到:x=min_number+m,這個等式的意思是:最終相等的值一定是由最小的數min_number+移動的次數m得到的。這裡有反證法,先預設成立。

那麼化簡等式:m=sum-min_number*n

這裡證明等式,假設不是由最小值加m次得到x的,假設是由另外一個值p加m次得到x的,那麼對於最小值min_number來說,被加的次數一定小於x,所以條件不成立。一定是最小的那個值加了m次得到的x。

參考程式碼:

class Solution {
public:
    int minMoves(vector<int>& nums) {
        if (nums.size() <= 1) return 0;
        int min_number = nums[0];
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
            if (min_number > nums[i]) min_number = nums[i];
        }
        return sum - min_number * nums.size();
    }
};

 

 

 

相關文章