判斷是否能在時間限制內抵達終點 Leetcode #2849

更新於 發佈於 閱讀時間約 4 分鐘
raw-image

這題的題目在這裡:Determine if a Cell Is Reachable at a Given Time

題目敘述

題目會給定我們兩個點座標,分別是起點和終點。

另外,還有一個參數t,代表時間限制。

從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點不能停留在原地)

註:
N8 8連通代表可以往東、南、西、北、東北、西北、東南、西南 選一個方向移動一格。

請問我們能不能在時間限制內,從起點走到終點?


測試範例

Example 1:

Input: sx = 2, sy = 4, fx = 7, fy = 7, t = 6
Output: true
Explanation: Starting at cell (2, 4), we can reach cell (7, 7) in exactly 6 seconds by going through the cells depicted in the picture above.

Example 2:

Input: sx = 3, sy = 1, fx = 7, fy = 3, t = 3
Output: false
Explanation: Starting at cell (3, 1), it takes at least 4 seconds to reach cell (7, 3) by going through the cells depicted in the picture above. Hence, we cannot reach cell (7, 3) at the third second.

約束條件

Constraints:

  • 1 <= sx, sy, fx, fy <= 10^9
  • 0 <= t <= 10^9

演算法

除了傳統的BFS + N8的路徑模擬演算法以外,其實,還可以使用Chebyshev distance來進行估計。

Chebyshev distance的定義就是兩個點座標,假設都沒有障礙物,在平面上N8 8連通走法的最短距離。

Chebyshev distance(x, y) = Max{ |x1-x2|, |y1-y2|}

從起點的視角來看,就像一個方形的同心紋路,一層一層,由內往外擴散

raw-image

因為,每一秒鐘移動一步,所以,假如兩點的Chebyshev distance <= 限制t

則代表,從起點出發,用N8 8連通的走法,可以在時間限制t內抵達終點。


唯一有一個例外,要特別小心,當起點等於終點,而且t=1時,反而無法抵達,為什麼?

題目有特別強調,每一秒必須強制移動到下一個格子點不能停留在原地

所以,當起點等於終點,而且t=1時,必須return False


程式碼

class Solution:
 def isReachableAtTime(self, sx: int, sy: int, fx: int, fy: int, t: int) -> bool:
  
  if sx == fx and sy == fy and t == 1:
   # Special case:
   # Each second, we must move one step
   return False

  # Optimal path's length = Chebyshev distance
  chebyshev_dist = max( abs(sx-fx), abs(sy-fy) )

  return chebyshev_dist <= t

複雜度分析

時間複雜度:

O(1) 使用Chebyshev distance估計,常數時間內可以計算出來。

空間複雜度:

O(1) 使用到的都是固定尺寸的臨時變數,為常數級別。


關鍵知識點

除了傳統的BFS + N8的路徑模擬演算法以外,其實,還可以使用Chebyshev distance來進行估計。

Chebyshev distance的定義就是兩個點座標,假設都沒有障礙物,在平面上N8 8連通走法的最短距離。

Chebyshev distance(x, y) = Max{ |x1-x2|, |y1-y2|}

從起點的視角來看,就像一個方形的同心紋路,一層一層,由內往外擴散。


Reference:

[1] Python O(1) by Chebyshev distance [+ Visualization] - Determine if a Cell Is Reachable at a Given Time - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
路程12分鐘,我只走8分鐘就到了,也許心裡只想速戰速決吧! 當下的想法只想要在過去的時間線裡,找到不一樣的機遇,就這樣,一路幾乎是用快走的步調前往以前工作的店,老實說心裡很忐忑,但是,比起忐忑的心情,我只想快點找完,結束回旅店休息。 旁邊的行李箱店,是找這間店的地標。 英國風味的茶葉蛋在電鍋中
最近在排個人行程時 常常記錯時間 兩個禮拜後 會記成下禮拜 禮拜二以為是禮拜三🤣 這難道是所謂的時間膨脹啦 哈哈 有質量的東西 沒有辦法達到光速 如果有能力 達到光速 時間會變慢 但是這個時間的計算 會不會也受到了 速度跟重力場的影響呢 所謂的時間變慢 是跟另一個基準比
Thumbnail
處在與時間賽跑,而且還是倒數計時的過程中,只能停下腳步30秒,紀錄這當下的美好。
Thumbnail
掐指算算:這趟三個月的旅程,一共搬了15次家。     而填在兩個移動點之間的是「等待」,前一處十至十一點退房,下一處下午三點至四點才能入住,所以移動通常表示會有四到六小時的空檔「無處安身」。     有伴一起耗當然便利許多,泡泡咖啡廳聊天,輪流看守行李去上廁所,或附近小逛一會兒。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
生活實驗 六六一 他留住時間的方式 是寫字, 一筆一劃,一勾一勒, 都有他的說法。 而我發現 我留得住時間的方式 是走路,來回的時間, 行程也勾勒好了。 我離家方圓三公里, 可是我有行程。 如果再加上公車, 我還可以遠足去 隔壁隔壁 幾里之外的蛋糕店、 又
Thumbnail
工時計算在一般的狀況下就是將『結束時間-開始時間』就會得到工時數。 為什麼可以時間可以直接相減? 延伸閱讀:搞懂EXCEL最常用也最難搞懂的日期&時間 但是如果遇到有輪班的時候,結束時間有可能會跨天,這時候直接『結束時間-開始時間』就會發生錯誤,原因是跨天後的結束時間<開始時間,而
基本數學吧,兩點之間最短的距離是直線,我們都被教育的很好。但是人生的路走著走著,我發現自己好像想錯了。我要的是最快,並不是最近。因為曾經以為最近就是最快,所以日子難免頭破血流。大家都擠在最明顯的最近的道路上時,能不能殺出一條血路,變成了惟一的問題,你可能都忘了,為什麼要走在這條路上。 有人說:就算
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
路程12分鐘,我只走8分鐘就到了,也許心裡只想速戰速決吧! 當下的想法只想要在過去的時間線裡,找到不一樣的機遇,就這樣,一路幾乎是用快走的步調前往以前工作的店,老實說心裡很忐忑,但是,比起忐忑的心情,我只想快點找完,結束回旅店休息。 旁邊的行李箱店,是找這間店的地標。 英國風味的茶葉蛋在電鍋中
最近在排個人行程時 常常記錯時間 兩個禮拜後 會記成下禮拜 禮拜二以為是禮拜三🤣 這難道是所謂的時間膨脹啦 哈哈 有質量的東西 沒有辦法達到光速 如果有能力 達到光速 時間會變慢 但是這個時間的計算 會不會也受到了 速度跟重力場的影響呢 所謂的時間變慢 是跟另一個基準比
Thumbnail
處在與時間賽跑,而且還是倒數計時的過程中,只能停下腳步30秒,紀錄這當下的美好。
Thumbnail
掐指算算:這趟三個月的旅程,一共搬了15次家。     而填在兩個移動點之間的是「等待」,前一處十至十一點退房,下一處下午三點至四點才能入住,所以移動通常表示會有四到六小時的空檔「無處安身」。     有伴一起耗當然便利許多,泡泡咖啡廳聊天,輪流看守行李去上廁所,或附近小逛一會兒。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
生活實驗 六六一 他留住時間的方式 是寫字, 一筆一劃,一勾一勒, 都有他的說法。 而我發現 我留得住時間的方式 是走路,來回的時間, 行程也勾勒好了。 我離家方圓三公里, 可是我有行程。 如果再加上公車, 我還可以遠足去 隔壁隔壁 幾里之外的蛋糕店、 又
Thumbnail
工時計算在一般的狀況下就是將『結束時間-開始時間』就會得到工時數。 為什麼可以時間可以直接相減? 延伸閱讀:搞懂EXCEL最常用也最難搞懂的日期&時間 但是如果遇到有輪班的時候,結束時間有可能會跨天,這時候直接『結束時間-開始時間』就會發生錯誤,原因是跨天後的結束時間<開始時間,而
基本數學吧,兩點之間最短的距離是直線,我們都被教育的很好。但是人生的路走著走著,我發現自己好像想錯了。我要的是最快,並不是最近。因為曾經以為最近就是最快,所以日子難免頭破血流。大家都擠在最明顯的最近的道路上時,能不能殺出一條血路,變成了惟一的問題,你可能都忘了,為什麼要走在這條路上。 有人說:就算