题目描述
给定一个非空整数数组 nums
,数组的每一个元素代表一个房间中的初始温度。你可以执行一个操作,将某个房间的温度增加 1 或减少 1。目标是让所有房间的温度相同。请问,你最少需要执行多少次操作来达到这个目标?
示例
输入:nums = [1, 2, 3]
输出:3
解释:你可以将第一个房间的温度从 1 增加到 2,第二个房间的温度不变,第三个房间的温度从 3 减少到 2。这样,所有房间的温度都相同,共执行了 3 次操作。
解题思路
- 寻找中位数:为了使得所有元素相等,最优的策略是将所有元素变为中位数,因为中位数到数组中任意其他元素的距离(差的绝对值之和)最小。
- 计算操作次数:遍历数组,计算每个元素与中位数的差的绝对值之和,即为所需的最少操作次数。
PHP 代码示例
function minMoves($nums) {
sort($nums); // 对数组进行排序
$median = $nums[floor(count($nums) / 2)]; // 找到中位数
$moves = 0;
foreach ($nums as $num) {
$moves += abs($num - $median); // 累加每个元素与中位数的差的绝对值
}
return $moves;
}
// 示例用法
$nums = [1, 2, 3];
echo minMoves($nums); // 输出 3
Python 代码示例
def minMoves(nums):
nums.sort() # 对数组进行排序
median = nums[len(nums) // 2] # 找到中位数
moves = sum(abs(num - median) for num in nums) # 计算所有元素与中位数的差的绝对值之和
return moves
# 示例用法
nums = [1, 2, 3]
print(minMoves(nums)) # 输出 3
JavaScript 代码示例
function minMoves(nums) {
nums.sort((a, b) => a - b); // 对数组进行排序
const median = nums[Math.floor(nums.length / 2)]; // 找到中位数
let moves = 0;
for (let num of nums) {
moves += Math.abs(num - median); // 累加每个元素与中位数的差的绝对值
}
return moves;
}
// 示例用法
const nums = [1, 2, 3];
console.log(minMoves(nums)); // 输出 3
码小课网站中有更多相关内容分享给大家学习,包括算法基础、数据结构、面试题解析等,欢迎访问并深入学习。