LeetCode 每日一题笔记
0. 前言
- 日期:2026.04.14
- 题目:2463.最小移动距离
- 难度:困难
- 标签:动态规划、排序、贪心
1. 题目理解
问题描述 :
在 X 轴上给定一组机器人位置和一组工厂(每个工厂有位置和修理容量)。
所有机器人需要移动到工厂维修,机器人可以向左或向右移动,到达未满的工厂即停止。
要求所有机器人移动的总距离最小,返回这个最小总距离。
示例:
输入:robot = [0,4,6], factory = [[2,2],[6,2]]
输出:4
解释:
机器人 0 → 工厂 2(距离 2)
机器人 4 → 工厂 2(距离 2)
机器人 6 → 工厂 6(距离 0)
总距离:2+2+0=4
2. 解题思路
核心观察
- 必须排序:机器人和工厂都按位置从小到大排序,才能保证最优分配(相邻分配最小距离);
- 带容量的分配问题:每个工厂最多修 k 个机器人;
- 动态规划 :
dp[i][j]:前 i 个工厂修理前 j 个机器人的最小总距离;- 第 i 个工厂可以修 1~limit 个机器人,枚举分配数量转移;
- 贪心 + DP 结合:排序后,连续分配机器人到工厂一定最优。
算法步骤
- 排序:机器人按坐标排序,工厂按位置排序;
- DP 初始化 :
dp[i][j]初始化为无穷大,dp[0][0]=0; - DP 转移 :
- 不使用第 i 个工厂:
dp[i][j] = dp[i-1][j] - 使用第 i 个工厂修 k 个机器人(k ≤ 容量):累加距离,取最小值;
- 不使用第 i 个工厂:
- 返回
dp[m][n](m 工厂,n 机器人)。
3. 代码实现
java
package com.sheeta1998.lec.lc2463;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Solution {
public long minimumTotalDistance(List<Integer> robot, int[][] factory) {
Collections.sort(robot);
Arrays.sort(factory, Comparator.comparingInt(a -> a[0]));
int n = robot.size();
int m = factory.length;
long[][] dp = new long[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
Arrays.fill(dp[i], (long) 1e18);
}
dp[0][0] = 0;
for (int i = 1; i <= m; i++) {
dp[i][0] = 0;
int pos = factory[i - 1][0];
int limit = factory[i - 1][1];
for (int j = 1; j <= n; j++) {
dp[i][j] = dp[i - 1][j];
long cost = 0;
for (int k = 1; k <= Math.min(limit, j); k++) {
cost += Math.abs(robot.get(j - k) - pos);
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - k] + cost);
}
}
}
return dp[m][n];
}
}
4. 代码优化说明
优化点1:空间优化(滚动数组)
当前使用二维 DP,可优化为一维 DP 倒序遍历,空间从 O(mn) → O(n)。
优化点2:提前剪枝
k 超过容量或 j 时直接停止,无多余循环。
优化点3:使用 long 避免溢出
移动距离总和可能很大,必须用 64 位整型。
5. 复杂度分析
- 时间复杂度 :O(m×n×L)O(m \times n \times L)O(m×n×L)
- m:工厂数
- n:机器人数
- L:工厂平均容量(最大为 n)
- 空间复杂度 :O(m×n)O(m \times n)O(m×n)(二维 DP)
6. 总结
- 本题是排序 + 动态规划的经典困难题;
- 核心思想:排序保证相邻分配最优,DP 枚举容量分配;
- DP 状态表示:前 i 个工厂修前 j 个机器人的最小距离;
- 转移方式:枚举当前工厂修 k 个机器人,累加距离取最小;
- 是"带容量分配最优匹配"的标准模板题。
关键点回顾
- 必须排序:机器人、工厂都按坐标排序
- DP 定义 :
dp[i][j]前 i 工厂修 j 机器人 - 转移:当前工厂修 k 个,k ≤ limit
- 距离累加:连续分配最后 k 个机器人
- 数据类型必须用 long