733.图像渲染 733. 图像渲染
解题思路:本题非常简单,无论是用图的BFS广度优先还是DFS深度优先,都可以非常快捷的解决。
复习数据结构的小伙伴,可以用递归和非递归的方法都写一下,顺便复习了。
class Solution {
public:
void bfs(vector<vector<int>>& image, int sr, int sc, int newColor){
int oldColor = image[sr][sc];
image[sr][sc] = newColor;
//上
if(sr-1>=0&&image[sr-1][sc]==oldColor){
bfs(image,sr-1,sc,newColor);
}
//下
if(sr+1<image.size()&&image[sr+1][sc]==oldColor){
bfs(image,sr+1,sc,newColor);
}
//左
if(sc-1>=0&&image[sr][sc-1]==oldColor){
bfs(image,sr,sc-1,newColor);
}
//右
if(sc+1<image[0].size()&&image[sr][sc+1]==oldColor){
bfs(image,sr,sc+1,newColor);
}
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
//广度优先搜索,递归
if(image[sr][sc]==newColor)
return image;
bfs(image,sr,sc,newColor);
return image;
}
};
注意:如果新的像素值和之前的像素值相同的话,就不需要改变了。
695.岛屿最大面积 695. 岛屿的最大面积
本题和上一个题差不多,LeetCode归为中等题,其实难度和简单题差不多;
遍历二维数组,找到第一个不为0的元素位置,对此元素进行BFS遍历,遍历过程中记录面积的大小,同时,将被遍历过的元素置为0,防止重复访问。
class Solution {
public:
void bfs(vector<vector<int>>& grid,int i, int j,int &area){
area++;
grid[i][j]=0;
//上
if(i-1>=0&&grid[i-1][j]==1){
bfs(grid,i-1,j,area);
}
//下
if(i+1<grid.size()&&grid[i+1][j]==1){
bfs(grid,i+1,j,area);
}
//左
if(j-1>=0&&grid[i][j-1]==1){
bfs(grid,i,j-1,area);
}
//右
if(j+1<grid[0].size()&&grid[i][j+1]==1){
bfs(grid,i,j+1,area);
}
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]==1){
int area = 0;
bfs(grid,i,j,area);
ans = max(ans,area);
}
}
}
return ans;
}
};
注:递归实现中上下左右的实现可以采用LeetCode官方给出的一个数组[-1,0,0,1],[0,-1,1,0]来控制。