055_岛屿数量

知识点:DFS、BFS

LeetCode第两百题:https://leetcode-cn.com/problems/number-of-islands/submissions/

BFS超时,怎么回事儿?目测是因为队列在扩容过程中存在复制,比较耗时?一样都是搜索,为啥DFS不会超时。而且还是双百?

语言:GoLang

var directs = [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
func numIslands(grid [][]byte) int {
    rowLen := len(grid)
    if rowLen == 0 {
        return 0
    }
    colLen := len(grid[0])

    count := 0
    for i := 0; i < rowLen; i++ {
        for j := 0; j < colLen; j++ {
            if grid[i][j] == '1' {
                dfs(grid, i, j, rowLen, colLen)
                count++
            }
        }
    }
    
    return count
}

// 一样都是搜索,为啥这个不会超时。而且还是双百?
func dfs(grid [][]byte, x, y, rowLen, colLen int) {
    grid[x][y] = '0'

    for _, direct := range directs {
        newX, newY := x + direct[0], y + direct[1]
        if newX < 0 || newX >= rowLen || newY < 0 || newY >= colLen {
            continue
        }
        if grid[newX][newY] == '1' {
            dfs(grid, newX, newY, rowLen, colLen)
        }
    }
}

// 超时,怎么回事儿?目测是因为队列在扩容过程中存在复制,比较耗时?
func bfs(grid [][]byte, x, y, rowLen, colLen int) {
    q := [][]int{{x, y}}

    for len(q) > 0 {
        s := len(q)
        for i := 0; i < s; i++ {
            c := q[0]
            q = q[1:]

            grid[c[0]][c[1]] = '0'

            for _, direct := range directs {
                newX, newY := c[0] + direct[0], c[1] + direct[1]
                if newX < 0 || newX >= rowLen || newY < 0 || newY >= colLen {
                    continue
                }
                if grid[newX][newY] == '1' {
                    q = append(q, []int{newX, newY})
                }

            }
        }
    }
}
posted @ 2020-04-11 14:40  Cenyol  阅读(89)  评论(0)    收藏  举报