判斷是否能在時間限制內抵達終點 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

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
如何判断是否还完情债?(感情课2023/06/21)如果是孽缘的感情,如何判断,这辈子怎么还没还完债? 学生的这个问题还是挺有意思的,这里需要分三层去理解: 第一层是本性选择,第二层是人道选择,第三层是天道选择。 1.本性选择 本性选择,顾名思义、很好理解,就是喜欢就喜欢,不喜欢就不喜欢,都随着自己的性子去做决定,大部分的人都这样,心智越年轻
Thumbnail
avatar
天善缘
2023-09-18
如何判断是否还完情债?(感情课2023/06/21)如果是孽缘的感情,如何判断,这辈子怎么还没还完债? 学生的这个问题还是挺有意思的,这里需要分三层去理解: 第一层是本性选择,第二层是人道选择,第三层是天道选择。 1.本性选择 本性选择,顾名思义、很好理解,就是喜欢就喜欢,不喜欢就不喜欢,都随着自己的性子去做决定,大部分的人都这样,心智越年轻
Thumbnail
avatar
天善缘
2023-09-14
《辣妹學》46 怎樣在第一次約會判斷男生是否大器、大方?建議大家試試這方法,更了解妳的心意,也更清楚對方是什麼樣的人。
avatar
後沙發
2023-08-04
總是可透過一些跡象,判斷孩子是否早熟。這時事是古人的智慧,也是朝三暮四這句成語的由來。 因此朝四之後,過了中午,接續給暮三,也沒人會在意。 畢竟可以稍微撼動制度,對某些小孩來說,就已心滿意足。 而看穿這一切而穩如泰山的兒童,可能要教導演技,避免早熟的不合群帶來霸凌。
avatar
始力拼達人
2023-03-31
你是不是"勞工",對雇主很重要!三大從屬性判斷是否為勞動契約我們都知道所謂的"勞工"都會和公司簽署"勞動契約"來約定彼此之間的勞雇關係,並且受到勞基法的規範。 但隨著公司經營的擴大,不同的業務需求越來越多時,公司和提供勞務者的關係就不一定是簽署"勞動契約"。 舉凡像是企業內的高階經理人(副總經理、分店店長),通常會與公司簽屬委任契約、還有像是按件計酬的勞務工
Thumbnail
avatar
人資行不行│人資布朗
2022-09-25
求職者注意!判斷是否要去這間公司的3個條件?轉職季、畢業季,相信有很多人為了未來職涯苦惱著,或者已經開始找尋自己想去的職位。但每當通知信到來時,猶豫該不該去這間公司呢? 「不知道公司給的福利好不好?」 「會不會被公司裡的老鳥排擠,而待不久?」 「跟想像中的不一樣,該怎麼辦?」 撿石頭的順序從原本大的→更大→一無所獲 選擇方法❷ 學習的機會
Thumbnail
avatar
瑞茜女孩
2022-04-16
7個方法預防憂鬱症/8個憂鬱症前兆判斷是否得了輕微憂鬱症這篇文章要分享五大重點: 一、導致憂鬱症的原因 二、8個憂鬱症前兆 三、如何預防憂鬱症 四、輕微憂鬱解決辦法 五、台灣心理諮商電話 如果你喜歡這篇文章,可以拍手、留言讓我知道,謝謝你的支持。 上周莫名其妙我有點小憂鬱,連續好幾天,對任何事都提不起勁來,連平常很有興趣的事情也沒動力去做。正在看這篇文章
Thumbnail
avatar
溫蒂老師
2021-10-07
許願池系列-如何判斷Reit是否安全?複利先生您好 因緣際會下發現Reits這個金融商品 參考網站 如下  https://richjamie.blogspot.com/2019/08/reits.html 發現裡面的MAC 與 KIM 這兩隻Reits 都跌到相對低點,殖利率看起來也不錯
avatar
複利先生
2020-10-01
怎樣判斷小孩是否為小兒多動癥? 說起小兒多動癥,各位家長應該不會陌生。家裏有個小兒多動癥的孩子,簡直讓家長苦不堪言。如何知道自己的小孩是單純的好動還是小兒多動癥?接下來,各位家長試著回答這3個問題便會有答案。   問題壹:妳的小孩是否長期註意力無法集中?   如果妳發現自己的孩子註意持久液長期無法有效集中,有以下的情況
Thumbnail
avatar
chaicai1
2020-08-23
好想追熱門股票?先學會判斷是否出現「出貨」模式股市的運作就是商業手法極致的表現,只是牽涉的利益更龐大,操作的手法更細膩,人性心理的運用更極致,一般人進到夜市或百貨公司都可能暫時迷失而比預期多花一點錢,更何況是進到運作更精細的股市?
Thumbnail
avatar
王俊忠
2017-12-18