当前位置: 面试刷题>> 使数组元素相同的最少步数Ⅰ (经典算法题500道)


题目描述

给定一个非空整数数组 nums,数组的每一个元素代表一个房间中的初始温度。你可以执行一个操作,将某个房间的温度增加 1 或减少 1。目标是让所有房间的温度相同。请问,你最少需要执行多少次操作来达到这个目标?

示例

输入nums = [1, 2, 3]

输出:3

解释:你可以将第一个房间的温度从 1 增加到 2,第二个房间的温度不变,第三个房间的温度从 3 减少到 2。这样,所有房间的温度都相同,共执行了 3 次操作。

解题思路

  1. 寻找中位数:为了使得所有元素相等,最优的策略是将所有元素变为中位数,因为中位数到数组中任意其他元素的距离(差的绝对值之和)最小。
  2. 计算操作次数:遍历数组,计算每个元素与中位数的差的绝对值之和,即为所需的最少操作次数。

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

码小课网站中有更多相关内容分享给大家学习,包括算法基础、数据结构、面试题解析等,欢迎访问并深入学习。