1266 訪問所有點的最小時間(分析)

1. 問題描述:

平面上有 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
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-time-visiting-all-points

2. 思路分析:

① 首先需要讀懂題目,需要注意題目中要求的兩個點,第一個點是我們需要從給定點的順序一個個進行到達,第二個點是每一次只能夠走對角線、水平、垂直方向,注意這兩個點之後,關鍵是需要找出其中的規律即可,從題目中的圖可以發現,假如兩個點是可以直接到達的可以分爲三種情況:

1)正方形的對角線,這個時候我們可以判斷出兩個點之間的橫座標與縱座標之間的距離是否相等來判斷是否是正方形的對角線

2)兩個點在同一水平線上,直接求解出兩個點的橫座標的差值即可

3)兩個點在同一垂直線上,直接求解出兩個點的縱座標的差值即可

② 上面的都是屬於兩個點可以直接到達的情況,我們只需要求解出其中的差值即可,除此之外屬於不能夠直接到達的情況,爲兩個點的連線不是正方形的對角線而是矩形對角線,這個時候我們需要求解出兩個點的橫座標與縱座標的最大取值即可,使用兩個變量x,y來更新到達了當前的點了

3. 代碼如下:

from typing import List


class Solution:
    def minTimeToVisitAllPoints(self, points: List[List[int]]) -> int:
        # 其實這道題目就是在找出對應的規律
        x, y = points[0][0], points[0][1]
        res = 0
        for point in points:
            # 先判斷哼座標與縱座標的絕對值是否相等假如相等那麼屬於正方形的對角線
            if abs(x - point[0]) == abs(y - point[1]):  # 說明是可以直接到達的
                res += abs(x - point[0])
            # 屬於同一垂直線上
            elif abs(x - point[0]) == 0:
                res += abs(y - point[1])
            # 屬於同一水平線上
            elif abs(y - point[1]) == 0:
                res += abs(x - point[0])
            else:
                # 矩形對角線可以求解出橫縱座標的最大值即可
                res += max(abs(x - point[0]), abs(y - point[1]))
            x, y = point[0], point[1]
        return res

 

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