leetcode DFS汇总贴 更新ing


在家这么久刷了不少题,也想着总结一下,欢迎看到的小伙伴一起打卡,监督学习进步,欢迎加v:15810853703,趁着五一节来更新一下博客qaq

题目描述

知识点:DFS(深搜问题)

200. 岛屿数量(5-1更新)

https://leetcode-cn.com/problems/number-of-islands/

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

关键点 遍历时将当前联通的陆地1转化为0 相当于击沉hh非常形象 当然也可以保存为其他数字
dfs 四个角度的写法 要学习一下

class Solution {
    void dfs(vector<vector<char>> &grid,int cur_i,int cur_j)
    {
        if(cur_i<0||cur_i==grid.size()||cur_j<0||cur_j==grid[0].size()||grid[cur_i][cur_j]=='0') return;
        grid[cur_i][cur_j]='0';
        int di[4]={0,0,1,-1};
        int dj[4]={1,-1,0,0};
        for(int index=0;index<4;index++)
        {
            dfs(grid,cur_i+di[index],cur_j+dj[index]);
        }
        return;
    }
public:
    int numIslands(vector<vector<char>>& grid) {
        int ans=0;
        for(int i=0;i<grid.size();i++)
        {
            for(int j=0;j<grid[0].size();j++)
            {
                if(grid[i][j]=='1')
                {
                    ans++;
                    dfs(grid,i,j);
                } 
            }
        }
        return ans;
    }

};
695. 岛屿的最大面积(5-1更新)

https://leetcode-cn.com/problems/max-area-of-island/

难度中等263

给定一个包含了一些 01 的非空二维数组 grid

一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0。)

示例 1:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]

关键点 如第一题一样要将遍历后的数字修改 求最大的联通大面积只要对返回值稍作修改就可

class Solution {
public:
    int dfs(vector<vector<int>>& grid ,int i,int j ){
        if(i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] != 1)return 0;

       grid[i][j] = 2;
    return 1+ dfs(grid, i - 1, j)+ dfs(grid, i + 1, j)+ dfs(grid, i, j - 1)+ dfs(grid, i, j + 1);
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        if(grid.size() == 0 || grid[0].size() == 0)return 0;

        int ans = 0;
        for(int i = 0; i< grid.size();i++){
            for(int j = 0 ;j < grid[0].size() ;j++){
                int res = dfs(grid,i,j);
                ans = max(res, ans);
            }
        }

        return ans;
    }
};
130. 被围绕的区域(5-10更新)

https://leetcode-cn.com/problems/surrounded-regions/

给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。

找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

示例:

X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X

关键点 逆向思维 dfs找和边界联通的点

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        if(board.size() < 3 || board[0].size() < 3)return ;
        int m = board.size() ,n = board[0].size();

        for(int i =0;i<m;i++){
            dfs(i,0,board);
            dfs(i,n-1,board);
        }
        for(int i =0;i<n;i++){
            dfs(0,i,board);
            dfs(m-1,i,board);
        }
        for(int i=0;i<m;i++){
            for(int j =0;j<n;j++){
                if(board[i][j] == 'O')board[i][j] = 'X';
                if(board[i][j] == '*')board[i][j] = 'O';
            }
        }
        return ;
    }
    void dfs(int x,int y,vector<vector<char>>& board){
        if(x < 0 || y < 0|| x >= board.size() || y >= board[0].size() || board[x][y]!= 'O')return;
        board[x][y] = '*';
        
        int di[4]={0,0,1,-1};
        int dj[4]={1,-1,0,0};
        for(int index=0;index<4;index++)
        {
            dfs(cur_i+di[index],cur_j+dj[index],borad);
        }
        return ;
    }
};

其他出现的DFS问题
欢迎大家补充~
之后刷到也会写在这里~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值