繼第 13 天的「217. Contains Duplicate」,今天來解 695 這題!還沒看過第 13 天或再之前天數的朋友,歡迎也去看看~
給予一個 m x n 的二維陣列或 grid ,其中元素的值只有 0 和 1 兩種。視 1 為島,請找出面積最大的島。
範例請直接看題目
自從我們知道我們要找到 1 的最大群集之後,解法就可以分成兩個主要部分
一個一個走訪,這邊的時間複雜度為 O(m * n)
這時候我們來定義 DP 子問題的「結束條件」和 routine
宣告一個變數儲存遇到 1 的次數,當探索到的位置為 1 加 1 接著,
取得走訪後的結果,和暫存的最大值比較後取最大值存回最大值的變數。
回傳暫存的最大值即為結果
class Solution {
func maxAreaOfIsland(_ grid: [[Int]]) -> Int {
var grid = grid
var result = 0
for (rowIndex, row) in grid.enumerated() {
for (columnIndex, column) in row.enumerated() {
if column == 1 {
result = max(result, discover(&grid, columnIndex, rowIndex))
}
}
}
return result
}
func discover(_ grid: inout [[Int]], _ column: Int, _ row: Int) -> Int {
if row < 0 || row >= grid.count || column < 0 || column >= grid[0].count || grid[row][column] != 1 { return 0 }
grid[row][column] = 0
var result = 1
result += discover(&grid, column + 1, row)
result += discover(&grid, column - 1, row)
result += discover(&grid, column, row + 1)
result += discover(&grid, column, row - 1)
return result
}
}
二維陣列的大小為 m x n
Big O | 說明 | |
---|---|---|
時間複雜度 | O(mn) | 線性走訪 |
空間複雜度 | O(mn) | 由於傳進方法的二維陣列為 immutable ,因此需要一個二維陣列來進行標記(改為 0) |
以上,就是今天的 LeetCode in Swift ,
如果有什麼問題和回饋歡迎留言一起討論,今天就到這裡,明天見!