【010】Leetcode—雙重指針—1266. 訪問所有點的最小時間(Sum of Square Numbers)

題目信息

平面上有 n 個點,點的位置用整數座標表示 points[i] = [xi, yi]。請你計算訪問所有這些點需要的最小時間(以秒爲單位)。

你可以按照下面的規則在平面上移動:

每一秒沿水平或者豎直方向移動一個單位長度,或者跨過對角線(可以看作在一秒內向水平和豎直方向各移動一個單位長度)。
必須按照數組中出現的順序來訪問這些點。

提示:

points.length == n
1 <= n <= 100
points[i].length == 2
-1000 <= points[i][0], points[i][1] <= 1000

示例:

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

解題思路

		#定義一個子函數 作用是計算從a移動到b所需要的最短時間
        def calc(a,b):
            return max(abs(a[0]-b[0]),abs(a[1]-b[1]))

        result = 0
        for index in range(len(points)-1):
            result += calc(points[index],points[index+1])
        
        return result

題目可分解成幾個子問題,最關鍵的是計算任意兩點之間移動所需要的最短時間,以[1,1]到[3,4]爲例,需要先走斜線到[3,3]然後再走直線,共需3步,可以理解成先走到與目標點延伸同一水平或者豎直線後再垂直或水平走,即求兩點之間距離投射到x和y軸分別的距離的最大值。(這塊讀起來可能比較晦澀,但是多拿幾個例子畫一下就可以理解了)

學習

TODO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章