351,最少移動次數使陣列元素相等 II

2021-10-09 19:12:20 字數 999 閱讀 7614

給定乙個非空整數陣列,找到使所有陣列元素相等所需的最小移動數,其中每次移動可將選定的乙個元素加1或減1。您可以假設陣列的長度最多為10000。

例如:

輸入: [1,2,3]

輸出: 2

說明: 只有兩個動作是必要的(記得每一步僅可使其中乙個元素加1或減1):

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

答案:

public

intminmoves2

(int

nums)

return count;

}

解析:這題其實更像是一道數學題,先來分析一下,我們假設把兩個數a,b(a<=b)經過最少的轉換最終變為x。這裡有3種情況

1,x<=a,轉變次數為(a-x)+(b-x)=(a+b)-2x;

2,a<=x<=b,轉變次數為(x-a)+(b-x)=b-a;

3,x>=b,轉變次數為(x-a)+(x-b)=2x-(a+b);

所以很明顯第二種情況轉換的次數是最少的,也就是說x在a和b之間的時候,轉換的次數是最少的。我們可以使用極限法證明

1,當x=a時取最小值,最小值是(a+b)-2a=b-a;

3,當x=b時取最小值,最小值是2b-(a+b)=b-a;

所以這個問題就很好解決了,我們只需要把陣列排好序,當陣列長度為2的時候,只需要大的減小的即可,當陣列長度為3的時候,我們只需要計算中間值與那兩個數差的絕對值的和即可(或者是最後乙個減去第乙個),當陣列長度為n的時候,我們只需要找到最中間值,然後每乙個數與他的差的絕對值相加即可。

453 最小移動次數使陣列元素相等

給定乙個長度為 n 的非空整數陣列,找到讓陣列所有元素相等的最小移動次數。每次移動可以使 n 1 個元素增加 1。示例 輸入 1,2,3 輸出 3 解釋 只需要3次移動 注意每次移動會增加兩個元素的值 1,2,3 2,3,3 3,4,3 4,4,4 題目說每次都將餘下n 1個元素加一,其實最優為留下...

453 最小移動次數使陣列元素相等

給定乙個長度為 n 的非空整數陣列,找到讓陣列所有元素相等的最小移動次數。每次移動可以使 n 1 個元素增加 1 示例 輸入 1,2,3 輸出 3 解釋 只需要3次移動 注意每次移動會增加兩個元素的值 1,2,3 2,3,3 3,4,3 4,4,4 題目解釋 假設陣列的長度為n,每次移動都會是其中n...

453 最小移動次數使陣列元素相等

給定乙個長度為 n 的非空整數陣列,找到讓陣列所有元素相等的最小移動次數。每次移動可以使 n 1 個元素增加 1。示例 輸入 1,2,3 輸出 3 解釋 只需要3次移動 注意每次移動會增加兩個元素的值 1,2,3 2,3,3 3,4,3 4,4,4 解法1 int minmoves vector i...