• 200. 岛屿数量


    200. 岛屿数量 https://leetcode-cn.com/problems/number-of-islands/

    func numIslands(grid [][]byte) int {
        n := len(grid)
        if n == 0{
            return 0
        }
        //初始全部未访问过 false。注意二: 给的是一个n*m数组,而不是n*n数组
        flag := make([][]bool,n)
        m := len(grid[0])
        for i:=0;i<n;i++{
            flag[i] = make([]bool,m)
        }
        res := 0
        for i:=0;i<n;i++{
            for j:=0;j<m;j++{
                if flag[i][j] == false && grid[i][j] == '1'{
                    dfs(flag,grid,n,m,i,j)
                    res++
                }
            }
        }
        return res
    }
    //注意一 不是else逻辑。
    func dfs(flag [][]bool,grid [][]byte, n,m ,i,j int) {
        if flag[i][j] == false && grid[i][j] == '1'{
            flag[i][j] = true
            if i-1 >=0{
                dfs(flag,grid,n,m,i-1,j)
            }
            if i+1 <n{
                dfs(flag,grid,n,m,i+1,j)
            } 
            if j-1>=0{
                dfs(flag,grid,n,m,i,j-1)
            } 
            if j+1<m{
                dfs(flag,grid,n,m,i,j+1)
            }
        }
        return 
    }
    

      优化不需要额外的flag数组,直接将元数组的1改成0

    func numIslands(grid [][]byte) int {
        n := len(grid)
        if n == 0{
            return 0
        }
        m := len(grid[0])
        res := 0
        for i:=0;i<n;i++{
            for j:=0;j<m;j++{
                if  grid[i][j] == '1'{
                    dfs(grid,n,m,i,j)
                    res++
                }
            }
        }
        return res
    }
    //注意一 不是else逻辑。
    func dfs(grid [][]byte, n,m ,i,j int) {
        if  grid[i][j] == '1'{
            grid[i][j] = '0'
            if i-1 >=0{
                dfs(grid,n,m,i-1,j)
            }
            if i+1 <n{
                dfs(grid,n,m,i+1,j)
            } 
            if j-1>=0{
                dfs(grid,n,m,i,j-1)
            } 
            if j+1<m{
                dfs(grid,n,m,i,j+1)
            }
        }
        return 
    }
    

      继续使用广度优先遍历,广度优先法稍微麻烦些,广度优先需要借助队列

    func numIslands(grid [][]byte) int {
        n := len(grid)
        if n == 0{
            return 0
        }
        m := len(grid[0])
        res := 0
        for i:=0;i<n;i++{
            for j:=0;j<m;j++{
                if  grid[i][j] == '1'{
                    bfs(grid,pair{i,j},n,m)
                    res++
                }
            }
        }
        return res
    }
    type pair struct {
        x int
        y int
    }
    //注意一 不是else逻辑。
    func bfs(grid [][]byte,p pair, n,m int) {
        if  grid[p.x][p.y] == '1'{
            grid[p.x][p.y] = '0'
            var queue []pair
            if p.x-1 >=0{
                queue = append(queue,pair{p.x-1,p.y})
            }
            if p.x+1 < n{
                queue = append(queue,pair{p.x+1 ,p.y})
            }
            if p.y-1>=0{
                queue = append(queue,pair{p.x,p.y-1})
            }
            if p.y+1<m{
                queue = append(queue,pair{p.x,p.y+1})
            }
            for len(queue) !=0 {
                bfs(grid,queue[0],n,m)
                queue = queue[1:]
            }
        }
        return 
    }
    

      优化下广度优先遍历

    func numIslands(grid [][]byte) int {
        n := len(grid)
        if n == 0{
            return 0
        }
        m := len(grid[0])
        res := 0
        for i:=0;i<n;i++{
            for j:=0;j<m;j++{
                if  grid[i][j] == '1'{
                    res++
                    var queue []pair
                    queue = append(queue,pair{i,j})
                    for len(queue) !=0 {
                        p := queue[0]
                        queue = queue[1:]
                        if p.x-1 >=0 && grid[p.x-1][p.y] == '1'{
                            queue = append(queue,pair{p.x-1,p.y})
                            grid[p.x-1][p.y] = '0'
                        }
                        if p.x+1 < n && grid[p.x+1][p.y] == '1'{
                            queue = append(queue,pair{p.x+1,p.y})
                            grid[p.x+1][p.y] = '0'
                        }
                        if p.y-1 >=0 && grid[p.x][p.y-1] == '1'{
                            queue = append(queue,pair{p.x,p.y-1})
                            grid[p.x][p.y-1] = '0'
                        }
                        if p.y+1 < m && grid[p.x][p.y+1] == '1'{
                            queue = append(queue,pair{p.x,p.y+1})
                            grid[p.x][p.y+1] = '0'
                        }
                    }
                }
            }
        }
        return res
    }
    type pair struct {
        x int
        y int
    }
    

      

  • 相关阅读:
    CSS外边距的合并
    四大主流浏览器内核
    ViewPort视口
    url、src、href定义以及使用区别
    Debug和Release区别
    基线概念
    浅谈C#循环控制流程语句(web前端基础)
    With you With me
    css元素内容基础
    年轻人有梦想,老人有回忆
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/12745226.html
Copyright © 2020-2023  润新知