1. 程式人生 > 實用技巧 >453. 最小移動次數使陣列元素相等

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

一、題目

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

示例:

輸入:
[1,2,3]

輸出:
3

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

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

二、題解

  • n個數中,有n-1個數+1 等價於 第n個數-1

    • //[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
      //[1,2,3]  =>  [1,2,2]  =>  [1,2,1]  =>  [1,1,1]
      
  • 每次移動有1個數-1,最終陣列中所有值都為最小值

    • 因此找到陣列中每個元素與最小值的差值之和,即為要移動的次數
    • 如[5, 2, 1]中,5, 2與最小值1的差值為4,1因此要移動4+1次
  • 優化——出現數值相等的情況,不移動,沒有值變化,因此可以跳過不用計算

class Solution {
    public int minMoves(int[] nums) {
            int count = 0;
            int min = nums[0];

            for (int i = 1; i < nums.length; i++) {
                min = Math.min(min,nums[i]);
            }
            for (int i = nums.length-1; i >= 0 ; i--) {
                if (nums[i]>min) {
                    count += (nums[i]-min);
                }
            }

            return count;
    }
}
  • 時間複雜度O(n)
  • 空間複雜度O(1)
  • 執行用時:2 ms, 在所有 Java 提交中擊敗了84.39%的使用者
  • 記憶體消耗:38.9 MB, 在所有 Java 提交中擊敗了91.15%的使用者