【數學】C048_訪問所有點的最小時間(切比雪夫距離)

一、題目描述

平面上有 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<dydx < dy:沿對角線移動 dx 次,再豎直移動 dy - dx 次,總計 dx + (dy - dx) = dy 次;
  • dx=dydx = dy:沿對角線移動 dx 次;
  • dx>dydx > dy:沿對角線移動 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;
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章