ETH官方钱包

前往
大廳
主題

LeetCode - 778. Swim in Rising Water 解題心得

Not In My Back Yard | 2021-08-24 00:00:03 | 巴幣 0 | 人氣 228

題目連結:


題目意譯:
在一個 N × N 的網格 grid 上,每個格子 grid[i][j] 代表著點 (i, j) 的標高。

現在雨開始下下來了。在時間 t 時,各處的水深皆為 t 。你可以從一個格子游到另一個四周相鄰之格子若且唯若兩個格子的標高各自最高為 t 。你可以在瞬間游無限遠的距離。當然,你游泳時必須待在 grid 的邊界範圍之中。

你出發於左上的格子 (0, 0)。你抵達右下角格子 (N - 1, N - 1) 的最短所需時間為何?

注:
2 ≦ N ≦ 50
grid[i][j] 為 [0, ……, N × N - 1] 的一種排列。



範例測資:
範例 1:
輸入: [[0,2],[1,3]]
輸出: 3
解釋:
在時間 0 時,你在 grid 中的位置 (0, 0)。
你無法前往任何地方,因為四周相鄰的鄰居格子們有著比 t = 0 更高的標高值。

你無法抵達點 (1, 1) 直到時間 3 為止。
當水深為 3 時,我們可以游到 grid 中的任意位置。

範例 2:
輸入: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
輸出: 16
解釋:最終路線如圖所示。
我們需要等到時間 16 時,才會使得 (0, 0) 與 (4, 4) 相連通。


解題思維:
已知時間點 t 時,我們可以利用廣度優先搜尋(Breadth First Search,BFS)的精神檢查 (0, 0) 是否與 (N - 1, N - 1) 連通(如這題)。

而我們可以看到在某個關鍵時間 T 之後的時間點,都保證我們可以從左上角游到右下角,而位於 T 之前的時間點則不行。因此,我們可以利用二分搜尋法(Binary Search)來搜尋得到這個 T 值——也就是我們將對答案進行二分搜,如這題的作法。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作