LeetCode.1266. 访问所有点的最小时间
平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)。
你可以按照下面的规则在平面上移动:
每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
必须按照数组中出现的顺序来访问这些点。
示例 1:
输入:points = [[1,1],[3,4],[-1,0]]
输出:7
解释:一条最佳的访问路径是: [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]
从 [1,1] 到 [3,4] 需要 3 秒
从 [3,4] 到 [-1,0] 需要 4 秒
一共需要 7 秒
示例 2:
输入:points = [[3,2],[-2,2]]
输出:5
提示:
points.length == n
1 <= n <= 100
points[i].length == 2
-1000 <= points[i][0], points[i][1] <= 1000
纯粹的数学方法:
切比雪夫距离 (Chebyshev Distance)
国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。
切比雪夫距离_国际象棋
二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离:
切比雪夫距离2维
n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)的切比雪夫距离:
切比雪夫距离n维
int max(int a, int b)
{
if (a > b)
{
return a;
}
return b;
}
int minTimeToVisitAllPoints(int** points, int pointsSize, int* pointsColSize){
int valueX, valueY;
int needTime = 0;
for (int i = 1; i < pointsSize; ++i)
{
valueX = abs(points[i - 1][0] - points[i][0]);
valueY = abs(points[i - 1][1] - points[i][1]);
needTime += max(valueX, valueY);
}
return needTime;
}