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]
分析:

高中数学问题,假设最后归一的数是x,那么移动的总次数为:|a1-x| + |a2-x| + |a3-x|+.....+ |an-x|。问题转换为求多个绝对值相加最小值的问题。假设a1 a2 a3 ...an是有序数组,那么有:

①n=2k

|a1 - x|+|an - x|>=|a1 - an| (当且仅当x∈[a1,an]时取=)

|a2 - x|+|an-1 - x|>=|a2 - an-1| (当且仅当x∈[a2,an-1]时取=)

|ak - x|+|ak+1 - x|>=|ak - ak+1| (当且仅当x∈[ak,ak+1]时取=)

所以:当x∈[ak,ak+1]值最小。

②n=2k-1

|a1 - x|+|an - x|>=|a1 - an| (当且仅当x∈[a1,an]时取=)

|a2 - x|+|an-1 - x|>=|a2 - an-1| (当且仅当x∈[a2,an-1]时取=)

|ak-1 - x|+|ak+1 - x|>=|ak-1 - ak+1| (当且仅当x∈[ak-1,ak+1]时取=)

最后还剩:|ak - x|

所以:当x=ak的之后值最小。

综上所述:x = ak的时候值最小。

代码:

class Solution {
    public int minMoves2(int[] nums) {
       Arrays.sort(nums);//保证是有序数组
        int x = nums[nums.length / 2];
        int min = 0;
        for (int i : nums) {
            min += Math.abs(i - x);
        }
        return min;  
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值