算法 - 图论02(Swift版本)

4 阅读1分钟

题目1:200. 岛屿数量

岛屿深搜
岛屿广搜

class Solution {
    func numIslands(_ grid: [[Character]]) -> Int {
        // 深搜每块岛屿
        var visited = Array(repeating: Array(repeating: false, count: grid[0].count), count: grid.count)
        var direction = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        func dfs(_ i: Int, _ j: Int) {
            guard i >= 0, i < grid.count, j >= 0, j < grid[0].count, grid[i][j] == Character("1"), !visited[i][j] else {
                return
            }
            visited[i][j] = true
            for forward in direction {
                dfs(i + forward.0, j + forward.1)
            }
        }
        var res = 0
        for i in 0..<grid.count {
            for j in 0..<grid[0].count {
                if visited[i][j] == false, grid[i][j] == Character("1") {
                    res += 1
                    dfs(i, j)
                }
            }
        }
        return res
}

class Solution {
    func numIslands(_ grid: [[Character]]) -> Int {
        // 广搜遍历岛屿
        var visited = Array(repeating: Array(repeating: false, count: grid[0].count), count: grid.count)
        var direction = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        func bfs(_ point: (Int, Int)) {
            var queue = [(Int, Int)]()
            queue.append(point)
            visited[point.0][point.1] = true
            while !queue.isEmpty {
                let curPoint = queue.removeLast()
                for forward in direction {
                    let nextX = curPoint.0 + forward.0
                    let nextY = curPoint.1 + forward.1
                    if nextX >= 0, nextX < grid.count, nextY >= 0, nextY < grid[0].count, 
                       grid[nextX][nextY] == Character("1"), !visited[nextX][nextY] {
                        visited[nextX][nextY] = true
                        queue.append((nextX, nextY))
                    }
                }
            }
        }
        var res = 0
        for i in 0..<grid.count {
            for j in 0..<grid[0].count {
                if visited[i][j] == false, grid[i][j] == Character("1") {
                    res += 1
                    bfs((i, j))
                }
            }
        }
        return res

    }
}

题目2:695. 岛屿的最大面积

讲解

class Solution {
    func maxAreaOfIsland(_ grid: [[Int]]) -> Int {
        var visited = Array(repeating: Array(repeating: false, count: grid[0].count), count: grid.count)
        let directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
        var count = 0
        var res = 0
        func dfs(_ i: Int, _ j: Int) {
            guard i >= 0, i < grid.count, j >= 0, j < grid[0].count, grid[i][j] == 1, !visited[i][j] else { return }
            count += 1
            visited[i][j] = true
            for direction in directions {
                dfs(i + direction.0, j + direction.1)
            }
        }
        for i in 0..<grid.count {
            for j in 0..<grid[0].count {
                if grid[i][j] == 1, !visited[i][j] {
                    count = 0
                    dfs(i, j)
                    res = max(res, count)
                }
            }
         }
        return res        
    }
}