当前位置: 面试刷题>> 使数组元素相同的最少步数Ⅰ (经典算法题500道)
### 题目描述
给定一个非空整数数组 `nums`,数组的每一个元素代表一个房间中的初始温度。你可以执行一个操作,将某个房间的温度增加 1 或减少 1。目标是让所有房间的温度相同。请问,你最少需要执行多少次操作来达到这个目标?
### 示例
**输入**:`nums = [1, 2, 3]`
**输出**:3
**解释**:你可以将第一个房间的温度从 1 增加到 2,第二个房间的温度不变,第三个房间的温度从 3 减少到 2。这样,所有房间的温度都相同,共执行了 3 次操作。
### 解题思路
1. **寻找中位数**:为了使得所有元素相等,最优的策略是将所有元素变为中位数,因为中位数到数组中任意其他元素的距离(差的绝对值之和)最小。
2. **计算操作次数**:遍历数组,计算每个元素与中位数的差的绝对值之和,即为所需的最少操作次数。
### PHP 代码示例
```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 代码示例
```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 代码示例
```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
```
**码小课网站中有更多相关内容分享给大家学习**,包括算法基础、数据结构、面试题解析等,欢迎访问并深入学习。