Minimum Moves to Equal Array Elements 最小移動次數使陣列元素相等
阿新 • • 發佈:2018-12-21
給定一個長度為 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(); } };