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
给定一个包含了一些 0
和 1
的非空二维数组 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问题
欢迎大家补充~
之后刷到也会写在这里~