LeetCode 每日一题笔记 日期:2026.04.14 题目:2463.最小移动距离

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 结合:排序后,连续分配机器人到工厂一定最优。

算法步骤

  1. 排序:机器人按坐标排序,工厂按位置排序;
  2. DP 初始化dp[i][j] 初始化为无穷大,dp[0][0]=0
  3. DP 转移
    • 不使用第 i 个工厂:dp[i][j] = dp[i-1][j]
    • 使用第 i 个工厂修 k 个机器人(k ≤ 容量):累加距离,取最小值;
  4. 返回 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 个机器人,累加距离取最小;
  • 是"带容量分配最优匹配"的标准模板题。

关键点回顾

  1. 必须排序:机器人、工厂都按坐标排序
  2. DP 定义dp[i][j] 前 i 工厂修 j 机器人
  3. 转移:当前工厂修 k 个,k ≤ limit
  4. 距离累加:连续分配最后 k 个机器人
  5. 数据类型必须用 long
相关推荐
吃好睡好便好2 小时前
提取矩阵某一行或某一列元素
开发语言·人工智能·线性代数·算法·matlab·矩阵
圣保罗的大教堂5 小时前
leetcode 2540. 最小公共值 简单
leetcode
云泽8086 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
ʚ希希ɞ ྀ6 小时前
不同路径|| -- dp
算法
IT 行者7 小时前
SimHash 与 MinHash:相似性计算的双子星算法
算法·hash·比对
智者知已应修善业8 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业8 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
暴躁小师兄数据学院8 小时前
【AI大数据工程师特训笔记】第04讲:PostgreSQL 数据库内置函数详解
大数据·数据库·笔记·ai·语言模型
小L~~~9 小时前
基于贪心策略的混合遗传算法求解01背包问题
python·算法