一、題目描述
平面上有 n 個點,點的位置用整數座標表示 points[i] = [xi, yi]。請你計算訪問所有這些點需要的最小時間(以秒爲單位)。
你可以按照下面的規則在平面上移動:
每一秒沿水平或者豎直方向移動一個單位長度,或者跨過對角線(可以看作在一秒內向水平和豎直方向各移動一個單位長度)。
必須按照數組中出現的順序來訪問這些點。
輸入: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 秒
二、題解
方法一:切比雪夫距離
設兩點之間的 x,y 軸距離是 dx 和 dy。秉持着可以走對角線,儘量走對角線的原則,不過在這題裏面,不不能一味地老師計算距離的。
我們發現當我們走過 max(dx, dy) 距離時,即使我們的路徑不對,但是秒數是對的。所以我們把情況歸納爲 3 種:
- :沿對角線移動 dx 次,再豎直移動 dy - dx 次,總計 dx + (dy - dx) = dy 次;
- :沿對角線移動 dx 次;
- :沿對角線移動 dy 次,再水平移動 dx - dy 次,總計 dy + (dx - dy) = dx 次。
public int minTimeToVisitAllPoints(int[][] P) {
int min = 0;
for (int i = 1; i < P.length; i++) {
int distX = Math.abs(P[i][0]-P[i-1][0]);
int distY = Math.abs(P[i][1]-P[i-1][1]);
min += Math.max(distX, distY);
}
return min;
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,