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具体步骤:
- 先走斜线,这一步走的距离 d i a g D i s t a n c e = a b s ( x s t a r t − x e n d ) + a b s ( y e n d − y e n d ) diagDistance = abs(x_{start} - x_{end}) + abs(y_{end} - y_{end}) diagDistance=abs(xstart−xend)+abs(yend−yend)。
- 再走直线,需要注意的是,此时当前点与终点在x方向与y方向上的距离,相比于起点,都减少了 d i a g D i s t a n c e diagDistance diagDistance。所以这一步走的距离 d i s t a n c e = ( a b s ( x s t a r t − x e n d ) − d i a g D i s t a n c e ) + ( a b s ( y s t a r t − y e n d ) − d i a g D i s t a n c e ) 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;
}
}