写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~
目录
题目一:733. 图像渲染
题目描述:
题目分析:
这题运用深度优先遍历(广度也可)即可求解,先判断停止遍历的情况,再进行深度优先遍历即可,详细做法见代码注释。
题解代码:
class Solution {
public:
int n,m,oldColor;
void DFS(vector<vector<int>>& image, int x, int y, int newColor)
{
if(x<0 || y<0 || x>=n || y>=m || image[x][y]!=oldColor || image[x][y]==newColor) //停止条件分别为数组越界时、当遇到边界时(即初始数字与目标数字不同)、目标数字与新数字相同时
return;
image[x][y]=newColor; //把目标数字赋值成新数字
DFS(image,x+1,y,newColor); //进行深度优先遍历
DFS(image,x-1,y,newColor);
DFS(image,x,y+1,newColor);
DFS(image,x,y-1,newColor);
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor)
{
n=image.size(); //数组的长与宽
m=image[0].size();
oldColor=image[sr][sc]; //初始数字记录为OldColor
if(oldColor != newColor) //若初始数字与新数字不一致的话,就从初始数字开始遍历
DFS(image,sr,sc,newColor);
return image;
}
};
题目二:695. 岛屿的最大面积
题目描述:
题目分析:
这题使用深度优先遍历的方法,先考虑边界等问题,再进行遍历并记录遍历过的岛屿,最后求岛屿的最大面积即可,详细做法见代码注释。
题解代码:
class Solution {
public:
int max=0,x,y; //定义每个整块岛屿面积的最大值以及地图的长和宽
void DFS(int nx,int ny,vector<vector<int>>& grid)
{
if(nx<0 || ny<0 || nx>=x || ny>=y || grid[nx][ny]==0) //当越界以及遇到水域时的情况
return;
if(grid[nx][ny]==2) //若岛屿已经记录过
return;
grid[nx][ny]=2; //记录没有记录过的岛屿
max++; //面积加1
DFS(nx+1,ny,grid); //深度优先遍历
DFS(nx-1,ny,grid);
DFS(nx,ny+1,grid);
DFS(nx,ny-1,grid);
}
int maxAreaOfIsland(vector<vector<int>>& grid)
{
x=grid.size(); //岛屿的长、宽
y=grid[0].size();
int maxone=0;
for(int i=0;i<x;i++) //遍历所有格子
{
for(int j=0;j<y;j++)
{
if(grid[i][j]==1) //若遇到岛屿便开始遍历
{
DFS(i,j,grid);
maxone=max>maxone?max:maxone;
max=0;
}
}
}
return maxone;
}
};