leetcode462. Minimum Moves to Equal Array Elements II

題目要求

Given a non-empty integer array, find the minimum number of moves required to make all array elements equal, where a move is incrementing a selected element by 1 or decrementing a selected element by 1.

You may assume the array's length is at most 10,000.

Example:

Input:
[1,2,3]

Output:
2

Explanation:
Only two moves are needed (remember each move increments or decrements one element):

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

問最少須要多少次操做,可以將數組中全部元素的值修改成同樣的(操做是指將數組中的元素加一或者減一)java

思路和代碼

其實這題就是找到數組的中位數,該中位數就是最終修改爲的元素。固然了,這裏的中位數不是廣義上的中位數,當數組的元素爲奇數時,「中位數」是從小到大排列後位於中間的數。若是是偶數的話,「中位數」是兩個中間的數之間的任意一個數字。數組

這裏不少人會覺得是計算出平均值做爲最終元素,其實否則。簡單的講一下爲什麼「中位數」是最終元素的緣由。假設有一個長度爲n的數組,其中包括元素a1, a2, ... an,已知該數組已經有序,則能夠知道,對於任意一個數字M,它到各個元素的距離和dist爲|a[1] - M| + |a[2] - M| + ... + |a[n] - M|。若是M<a1, 則dist = n * M - sum, 同理,若是M > a1, 則dist = sum - n * M。 簡單來講,若是M小於最小值或是大於最大值,每一個元素都必須走到最小值或最大值以外才能到達M,所以M必定位於[a1, an]之間。ui

如今開始找M的最佳位置。將M從最小值a1逐步向最大值an移動。假設M=a1+1且M<a2, 此時能夠確信的是a1的移動距離增長了1,可是同時an的移動距離減小了1。也就是說,若是M在ai和aj間移動,兩者到M的距離和是不變的。可是對於a2,a3...,a[n-1]來講,每一個元素的移動距離都減小了1。也就是說,C在不斷的向中位數移動的時候,對於總體數組的移動距離和來講是不斷減小的。同理,當C到達中位數,而且繼續向右移動時,會發現總體數組的移動距離也隨之增長。code

代碼以下:element

public int minMoves2(int[] nums) {
        Arrays.sort(nums);
        int i = 0, j = nums.length - 1, result = 0;
        while(i < j) {
            result += nums[j--] - nums[i++];
        }
        return result;
    }
相關文章
相關標籤/搜索