前往
大廳
主題

LeetCode - 827. Making A Large Island 解題心得

Not In My Back Yard | 2022-01-02 00:00:05 | 巴幣 2 | 人氣 258

題目連結:


題目意譯:
你被給定一個 n × n 的二元陣列 grid。你被允許使最多一個 0 改變為 1。

回傳套用此操作後 grid 中最大的島嶼之大小。

一座島嶼為四方向相連接之 1 的群體。

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



範例測資:
範例 1:
輸入: grid = [[1,0],[0,1]]
輸出: 3
解釋: 將一個 0 變為 1 而將兩個 1 相連,因此我們便得到面積 = 3 之島嶼。

範例 2:
輸入: grid = [[1,1],[1,0]]
輸出: 4
解釋: 將一個 0 變為 1 而使得島嶼變大,得到一座面積 = 4 之島與。

範例 3:
輸入: grid = [[1,1],[1,1]]
輸出: 4
解釋: 無法將任何 0 變為 1,其只有著一座面積 = 4 之島嶼。


解題思維:
可以先依據一般的廣度優先搜尋(Breadth First Search,BFS)將每塊島嶼的面積求出來(如這題)。不過我們需要額外記錄每塊島嶼的「中心」,使得在島嶼上任一格都可以直接知道中心在哪(可以統一設為島嶼最左上角之位置)。

接著便可以掃過整個 grid 去找 0。將每一個 0 都試試看變成 1。

當有一個 0 變為 1 時,其將會把上下左右的島嶼相連(如果有的話)。但是有可能上下左右之中有些方向的「1」是屬於同一座島嶼的。這時候「中心」便派上了用場。

我們將四個方向的島嶼(如果某方向沒有接著島嶼或是超界了就忽略)之中心都找出來,將重複的消掉,最後才把剩下的島嶼併在一起。面積則就是這些合併的島嶼之面積總和 + 1(別忘記一開始被變成 1 的 0)。

然後看哪個 0 得到的島嶼面積最大即為所求,而如果不存在任何 0,那所求為 BFS 找出的島嶼中面積最大的。




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

創作回應

更多創作