前往
大廳
主題

LeetCode - 1631. Path With Minimum Effort 解題心得

Not In My Back Yard | 2023-02-17 12:00:01 | 巴幣 0 | 人氣 152

題目連結:


題目意譯:
你是一位準備進行單車行的自行車騎士。你被給定 heights,一個大小為 rows × columns 的二維陣列,其中 heights[row][col] 代表著格子 (row, col) 的高度。你位於左上角的格子 (0, 0),並希望可以騎到右下角的格子 (row - 1, col - 1)(即索引值從 0 開始)。你可以往上、下、左或右移動,而你希望找到一個需要最少精力的路線。

一個路線的精力定義為該路線中兩個連續格子的高度絕對差之最大值。

回傳從左上角格子騎到右下角最少所需的精力。

限制:
rows == heights.length
columns == heights[i].length
1 ≦ rows, columns ≦ 100
1 ≦ heights[i][j] ≦ 10 ^ 6



範例測資:
範例 1:
輸入: heights = [[1,2,2],[3,8,2],[5,3,5]]
輸出: 2
解釋: 路徑 [1,3,5,3,5] 有著連續格子最大絕對差值 2。
該路線比路線 [1,2,2,2,5] 還好,其最大絕對差值為 3。

範例 2:
輸入: heights = [[1,2,3],[3,8,4],[5,3,5]]
輸出: 1
解釋: 路徑 [1,2,3,4,5] 有著連續格子最大絕對差值 1,其比路徑 [1,3,5,3,5] 還好。

範例 3:
輸入: heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
輸出: 0
解釋: 此路線不需任何精力。


解題思維:
又是一題可以對「答案」進行二分搜尋法(Binary Search)的題目(如這題一般)。

一開始隨便猜一個精力值(根據變數範圍,第一次可以直接猜 10 ^ 6 ÷ 2 = 500000),然後從左上角開始進行廣度優先搜尋(Breadth First Search,BFS)。

過程中,我們能「擴散」到的格子滿足該格子到當前格子的絕對差值不超過猜的精力值。如果在這個條件下還可以擴散到右下角,則代表我們猜的精力值是夠大的,因此可以猜小一點(例如說猜 500000 ÷ 2 = 250000);反之,代表我們猜的太小了以致於無法抵達終點,因此應猜大一點(例如說 (500000 + 10 ^ 6) ÷ 2 = 750000)。

最後我們便可以收斂到一個精力值其既可以讓我們抵達終點又是盡可能小的數值。




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

創作回應

更多創作