1. 题目解析与核心思路
LeetCode 1266题"访问所有点的最小时间"是一道典型的二维平面移动问题。题目给出平面上一系列点的坐标,要求计算从第一个点依次移动到最后一个点所需的最小时间。移动规则是:每秒可以沿水平、垂直或对角线方向移动一个单位距离。
这道题看似简单,但蕴含着对几何距离计算的巧妙应用。关键在于理解在平面直角坐标系中,两点之间的最小移动时间实际上由它们的切比雪夫距离(Chebyshev distance)决定。切比雪夫距离定义为两点在各坐标轴上差值的最大值,这与国际象棋中王的移动方式完全一致。
举个例子,从点(1,1)移动到点(3,4):
- x轴距离:3-1=2
- y轴距离:4-1=3
- 最小时间=max(2,3)=3秒
因为在对角线移动时,可以同时缩短x和y方向的距离,所以总时间取决于两个方向距离中的较大值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现与代码详解
2.1 基础解法
最直接的解法是遍历点序列,计算相邻两点之间的切比雪夫距离并累加。以下是Python实现:
python复制def minTimeToVisitAllPoints(points):
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)
time += max(dx, dy)
return time
这个实现的时间复杂度是O(n),其中n是点的数量,因为只需要一次遍历。空间复杂度是O(1),只使用了常数级别的额外空间。
2.2 优化技巧
虽然基础解法已经很高效,但仍有几个可以优化的地方:
- 使用zip函数简化相邻点对的获取:
python复制def minTimeToVisitAllPoints(points):
return sum(max(abs(x2-x1), abs(y2-y1))
for (x1,y1), (x2,y2) in zip(points, points[1:]))
- 对于大型
