Description:
On a plane there are n points with integer coordinates points[i] = [xi, yi]. Your task is to find the minimum time in seconds to visit all points.
You can move according to the next rules:
- In one second always you can either move vertically, horizontally by one unit or diagonally (it means to move one unit vertically and one unit horizontally in one second).
- You have to visit the points in the same order as they appear in the array.
Example 1:

Input: points = [[1,1],[3,4],[-1,0]]
Output: 7
Explanation: One optimal path is [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]
Time from [1,1] to [3,4] = 3 seconds
Time from [3,4] to [-1,0] = 4 seconds
Total time = 7 seconds
Example 2:
Input: points = [[3,2],[-2,2]]
Output: 5
Constraints:
- points.length == n
- 1 <= n <= 100
- points[i].length == 2
- -1000 <= points[i][0], points[i][1] <= 1000
Analysis:
两种方法:
- 先走斜线,直到到达一个横坐标或纵坐标与终点相同的点,然后开始走直线。
- 先走直线,直到到达一个可以通过走斜线到达终点的点,然后开始走斜线。
两种方法等价,但是从编程角度出发,第一种方法更容易实现。
方法1具体步骤:
- 先走斜线,这一步走的距离diagDistance=abs(xstart−xend)+abs(yend−yend)diagDistance = abs(x_{start} - x_{end}) + abs(y_{end} - y_{end})diagDistance=abs(xstart−xend)+abs(yend−yend)。
- 再走直线,需要注意的是,此时当前点与终点在x方向与y方向上的距离,相比于起点,都减少了diagDistancediagDistancediagDistance。所以这一步走的距离distance=(abs(xstart−xend)−diagDistance)+(abs(ystart−yend)−diagDistance)distance = (abs(x_{start} - x_{end}) - diagDistance) + (abs(y_{start} - y_{end}) - diagDistance)distance=(abs(xstart−xend)−diagDistance)+(abs(ystart−yend)−diagDistance)。
Code:
class Solution {
public int minTimeToVisitAllPoints(int[][] points) {
int distances = 0;
for(int i = 0; i < points.length-1; i++) {
int distance = calc(points[i], points[i+1]);
distances += distance;
}
return distances;
}
public int calc(int[] pointX, int[] pointY) {
int diagDistance = Math.min(Math.abs(pointX[0] - pointY[0]), Math.abs(pointX[1] - pointY[1]));
int distance = diagDistance + (Math.abs(pointX[0] - pointY[0]) - diagDistance) + (Math.abs(pointX[1] - pointY[1]) - diagDistance);
return distance;
}
}
本文探讨了在一个由整数坐标构成的行星上,如何找到遍历所有n个点所需的最短时间。通过分析两种移动策略,文章详细解释了如何在一秒内垂直、水平或对角线移动一单位距离,以确保按给定点阵顺序访问每个点。举例说明了不同输入下最优路径的计算过程,同时提供了一种简单易实现的方法。

被折叠的 条评论
为什么被折叠?



