ETH官方钱包

前往
大廳
主題

LeetCode - 1568. Minimum Number of Days to Disconnect Island 解題心得

Not In My Back Yard | 2024-09-06 12:00:01 | 巴幣 0 | 人氣 40

題目連結:


題目意譯:
你被給定一個大小為 m × n 的二元網格 grid,其中 1 代表著陸地、 0 則代表著水域。一座島嶼是極大化(即無法再更大了)四方向(即水平或垂直方向)相連的一連串 1。

如果網格只有恰好一座島嶼,則稱為「連通的」;反之,則稱為「非連通的」。

在一天中,我們允許將任意一個陸地格子(1)變成一個水域格子(0)。

回傳最少所需天數使得 grid 變為非連通。

限制:
m == grid.length
n == grid[i].length
1 ≦ m, n ≦ 30
grid[i][j] 只會是 0 或是 1。



範例測資:
範例 1:
輸入: grid = [[0,1,1,0],[0,1,1,0],[0,0,0,0]]
輸出: 2
解釋: 我們需要至少 2 天來使 grid 變為非連通。
將 grid[1][1] 和 grid[0][2] 變成水域並得到兩個彼此非連通的島嶼。

範例 2:
輸入: grid = [[1,1]]
輸出: 2
解釋: 只含有水域的網格也算是非連通的([[1,1]] -> [[0,0]]),即 0 座島嶼。


解題思維:
可以看到答案絕對不會大於 2,也就是說最糟只需要 2 天便可以將島嶼變成非連通的。因為我們可以選最「邊邊角角」的地方移除 2 個陸地格子來隔離出單一一個島嶼(如範例一)。

而最佳則是 0 天,即一開始 grid 就已經有超過 1 座的島嶼了。而這個檢查方式很簡單,方式跟昨天的題目基本一樣,用深度優先搜尋(Depth First Search,DFS)或是廣度優先搜尋(Breadth First Search,BFS)都可以。一樣範例程式碼是用前者的方式。

那 1 天的情況實際上也沒有那麼複雜,只要窮舉要移除哪一個格子然後用與上面相同的方式檢查島嶼數量即可。

可以看到時間複雜度的瓶頸是在檢查 1 天的情況,所以總體最糟時間複雜度為 O(mn × mn)(即單次檢查的時間乘以總格子數)。不過實際上有辦法可以降低時間複雜度到 O(mn),這部份則交給讀者思考(提示:跟這題的核心精神有關)。




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

創作回應

更多創作