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
相关推荐
feng_you_ying_li2 小时前
C++11可变模板参数,包扩展,emplace系列和push系列的区别
前端·c++·算法
tankeven2 小时前
HJ177 可匹配子段计数
c++·算法
剑挑星河月2 小时前
55.跳跃游戏
数据结构·算法·leetcode
Gofarlic_OMS2 小时前
中小企业控制方法:中小型制造企业Creo许可证成本控制
java·大数据·运维·算法·matlab·制造
星马梦缘2 小时前
快表、页表地址获取+缓存、主存、硬盘数据获取
算法·操作系统·os·tlb
大尚来也2 小时前
Go性能优化实战:如何减少内存分配,榨干每一滴性能
算法
阳光宅男@李光熠2 小时前
【电子通识】为什么PCB能短接还要用0Ω电阻?0欧电阻怎么做降额?
笔记·学习
W23035765732 小时前
算法详解:矩阵连乘问题(动态规划 C++ 完整实现)
算法·动态规划·矩阵连乘