题目描述补充
题目:使数组元素相同的最少步数II
给定一个非空整数数组 nums
,数组中的每个元素都在 0
到 10000
的范围内。在每一步操作中,你可以选择任意一个元素并给它加上或减去 1
,目标是使得数组中的所有元素都相等。你的任务是找出使所有数组元素相等所需的最少步数。
示例
- 输入:
nums = [1, 2, 3]
- 输出:
2
- 解释:通过两步操作可以将数组
[1, 2, 3]
变为[2, 2, 2]
。第一步,将1
增加到2
;第二步,将3
减少到2
。
解题思路
- 为了最小化步数,我们应该将所有元素转化为它们的中位数,因为中位数将使得需要移动的总距离最小。
- 计算中位数,可以使用排序然后取中间值(如果是偶数个数,可以取中间两个数的平均值或者任一个中位数,结果相同)。
- 遍历数组,计算每个元素到中位数的距离(绝对值),累加这些距离即为所需的最少步数。
PHP 示例代码
function minMoves2($nums) {
sort($nums);
$mid = $nums[floor(count($nums) / 2)]; // 获取中位数
$moves = 0;
foreach ($nums as $num) {
$moves += abs($num - $mid);
}
return $moves;
}
// 示例
$nums = [1, 2, 3];
echo minMoves2($nums); // 输出 2
Python 示例代码
def minMoves2(nums):
nums.sort()
mid = nums[len(nums) // 2] # 获取中位数
moves = sum(abs(num - mid) for num in nums)
return moves
# 示例
nums = [1, 2, 3]
print(minMoves2(nums)) # 输出 2
JavaScript 示例代码
function minMoves2(nums) {
nums.sort((a, b) => a - b);
const mid = nums[Math.floor(nums.length / 2)]; // 获取中位数
let moves = 0;
for (let num of nums) {
moves += Math.abs(num - mid);
}
return moves;
}
// 示例
const nums = [1, 2, 3];
console.log(minMoves2(nums)); // 输出 2
码小课:希望这些示例和解题思路能帮助你在面试中更好地理解和解答这个问题。在码小课网站上,还有更多算法和数据结构相关的内容等待你的探索和学习,助你在编程之路上越走越远。