1. 问题背景与核心理解
LeetCode 1266题"访问所有点的最小时间"是一个典型的二维平面移动优化问题。题目给出一个二维平面上的点序列points,其中points[i] = [xi, yi],要求从第一个点出发依次访问所有点,计算完成整个路径所需的最小时间。
这里的移动规则特别之处在于:在单位时间内,可以沿对角线方向移动(相当于同时改变x和y坐标),也可以沿水平或垂直方向移动(仅改变一个坐标)。这种移动方式实际上模拟了国际象棋中"国王"的走法。
关键提示:理解对角线移动的价值是解题的核心。因为对角线移动能在1个单位时间内同时改变x和y坐标,这通常比先水平后垂直移动更高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 贪心算法思路解析
2.1 移动策略的数学本质
对于任意两个相邻点A(x1,y1)和B(x2,y2),计算它们之间的最小移动时间,实际上就是计算切比雪夫距离(Chebyshev distance):
code复制max(|x2 - x1|, |y2 - y1|)
这个距离公式的直观解释是:尽可能多地使用对角线移动来同时减少x和y方向的差距,剩余的部分再通过水平或垂直移动完成。
2.2 为什么贪心算法有效
贪心算法在这里的有效性基于以下观察:
- 点与点之间的移动是独立的(无后效性)
- 局部最优解(相邻两点间的最短时间)能构成全局最优解
- 不需要考虑路径规划中的障碍或复杂约束
因此,我们只需要简单累加相邻点之间的切比雪夫距离,就能得到全局最优解。
3. Python实现与优化
3.1 基础实现版本
我们先看一个清晰易懂的实现方式:
python复制def minTimeToVisitAllPoints(points):
total_time = 0
for i in range(len(points)-1):
x1, y1 = points[i]
x2, y2 = points[i+1]
dx = abs(x2 - x1)
dy = abs(y2 - y1)
total_time += max(dx, dy)
return total_time
这个实现:
- 初始化总时间为0
- 遍历所有相邻点对
- 计算每对点之间的dx和dy
- 取两者较大值累加到总时间
- 最后返回总时间
时间复杂度:O(n),空间复杂度:O(1)
3.2 一行Python优化版
利用Python的生成器表达式和zip函数,可以将其压缩为一行:
python复制def minTimeToVisitAllPoints(points):
return sum(max(abs(p2[0]-p1[0]
