1. 题目描述
https://leetcode.cn/problems/minimum-moves-to-equal-array-elements-ii/
给你一个长度为 n
的整数数组 nums
,返回使所有数组元素相等需要的最少移动数。
在一步操作中,你可以使数组中的一个元素加 1 或者减 1 。
示例 1:
输入:nums = [1,2,3]
输出:2
解释:
只需要两步操作(每步操作指南使一个元素加 1 或减 1):
[1,2,3] => [2,2,3] => [2,2,2]
示例 2:
输入:nums = [1,10,2,9]
输出:16
提示:
- n == nums.length
- 1 <= nums.length <= 105
- -109 <= nums[i] <= 109
2. 题解
2022-05-19 AC, 都变为**中位数**
为最优解
一开始直觉是都变为**平均数**
, 但是当数组里有2个较大的值时[1,800,810], 那么去把1加到800 肯定要比 两个800多的变成537要好
<?php
/**
* Created by PhpStorm
* User: jtahstu
* Time: 2022/5/19 2:16
* Des: 462. 最少移动次数使数组元素相等 II
* https://leetcode.cn/problems/minimum-moves-to-equal-array-elements-ii/
* 给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。在一步操作中,你可以使数组中的一个元素加 1 或者减 1 。
*/
class Solution
{
/**
* @param Integer[] $nums
* @return Integer
*/
function minMoves2($nums)
{
$n = count($nums);
sort($nums);
$mid = $nums[$n >> 1];
$count = 0;
for ($i = 0; $i < $n; $i++) {
$count += abs($nums[$i] - $mid);
}
return $count;
}
}
/**
* 两边都加减到中位数是最优解
*
* 执行用时:24 ms, 在所有 PHP 提交中击败了100.00%的用户
* 内存消耗:19.9 MB, 在所有 PHP 提交中击败了100.00%的用户
* 通过测试用例:30 / 30
*/