題目連結:
題目意譯:
你被給定一個 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 找出的島嶼中面積最大的。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。