Go语言解LeetCode1266:访问所有点的最小时间
本文介绍如何利用Go语言实现LeetCode第1266题“访问所有点的最小时间”的解题方案,核心在于计算相邻点之间的切比雪夫距离。
题目描述
平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请计算访问所有这些点需要的最小时间(以秒为单位)。
移动规则如下:
- 每秒可水平移动一个单位;
- 或竖直移动一个单位;
- 或跨过对角线移动(同时改变x和y坐标,视为一秒内完成)。必须按照数组中出现的顺序访问这些点。
示例 1:
输入:points = [[1,1],[3,4],[-1,0]]
输出:7
解释:最佳路径包括在对角线移动与水平/垂直移动之间切换,以最短时间覆盖距离。
思路分析
在允许对角线移动的情况下,两点之间的最短路径长度即为数学上的切比雪夫距离。这意味着两点间的时间消耗等于其横纵坐标差值的绝对值中的较大者。
设当前点为 (x1, y1),下一个点为 (x2, y2),则两点间耗时计算公式为:max(|x1 - x2|, |y1 - y2|)。
整体策略是遍历整个点数组,累加每一对相邻点之间的这个最大值,所得总和即为访问完所有点所需的最少时间。
Go 语言 AC 代码
以下是使用 Go 语言编写的完整解决方案,利用了内置的标准库函数进行清晰高效的实现。
package main
import (
"fmt"
"math"
)
func minTimeToVisitAllPoints(points [][]int) int {
totalTime := 0
// 从第二个点开始遍历
for i := 1; i < len(points); i++ {
prev := points[i-1]
curr := points[i]
// 计算横纵坐标的绝对差值
deltaX := math.Abs(float64(curr[0] - prev[0]))
deltaY := math.Abs(float64(curr[1] - prev[1]))
// 取两者中的较大值作为该段路径的耗时
if deltaX > deltaY {
totalTime += int(deltaX)
} else {
totalTime += int(deltaY)
}
}
return totalTime
}
func main() {
// 测试示例 1
points := [][]int{{1, 1}, {3, 4}, {-1, 0}}
result := minTimeToVisitAllPoints(points)
fmt.Println(result) // 预期输出: 7
}
上述代码逻辑严谨且易读。对于每一个连续的点对,分别计算出横向位移与纵向位移,然后取最大值累加到总时间变量中,完美契合题意要求。
以上就是Go语言解LeetCode1266访问所有点的最小时间的详细内容,更多关于Go算法题解的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









