LeetCode算法入门(第七天)
广度优先搜索/深度优先搜索
733.图像渲染
解法:读题十分费劲,看示例结合理解,大致意思就是例如:给定起始点像素点
p
[
4
,
4
]
p_{[4,4]}
p[4,4]位置的像素值为1,给定一个新的颜色值为2,因为像素点
p
[
4
,
4
]
p_{[4,4]}
p[4,4]的颜色值1不等于新的颜色值2,所以需要重新给该像素点
p
[
4
,
4
]
p_{[4,4]}
p[4,4]赋新的颜色值为2,然后以起始点p开始向p的上下左右四个方向查找与起始点p初始的像素值1相等的点,将其赋新的颜色值2,如果新找到的点的四个方向上仍有与起始点的初始像素值1相等的点就继续重复搜索与上色操作。
解法主要就是深度优先遍历DFS和广度优先遍历BFS,这里放上讲解链接https://developer.51cto.com/article/614590.html
简洁来说,DFS就是一个递归的过程,类似对一棵树进行前序遍历,而BFSl类似于树的层序遍历。
lass Solution {
public:
const int dx[4] = {1, 0, 0, -1};
const int dy[4] = {0, 1, -1, 0};
void dfs(vector<vector<int>>& image, int x, int y, int color, int newColor) {
if (image[x][y] == color) { //如果初始点的像素值等于初始颜色值, 即 初始点像素值还未改变,记录下初始值
image[x][y] = newColor; //将初始点的像素值更新为新的颜色值newcolor
for (int i = 0; i < 4; i++) {
int mx = x + dx[i], my = y + dy[i];
if (mx >= 0 && mx < image.size() && my >= 0 && my < image[0].size()) {
dfs(image, mx, my, color, newColor); //依次判断右以及右的四个方向依次递归下去,的颜色值是否与初始点未改变之前的颜色值color相同,相同则更新,为newColor,其他三个方向也如此
}
}
}
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
int currColor = image[sr][sc];
if (currColor != newColor) { //如果初始点的像素值不等于新的颜色值newColor,则进行深度搜索
dfs(image, sr, sc, currColor, newColor);
}
return image;
}
};
699.岛屿的最大面积
解法:刚开始读题以为是返回总共有多少个岛屿,对于示例输出结果为6,百思不得其解,另外水平竖直第一眼理解不是两个方向吗,写成上下左右的话就更好理解了,这题跟上面那题是类似的方法,同样需要注意的是避免重复访问,上一题是找到一个相同的像素点就将其赋上新的颜色,避免重复查找,本题是将遍历过的点置为0代表水,来避免重复查找,另外边界条件也需要考虑周全。
class Solution {
public:
int dfs(vector<vector<int>>& grid, int cur_i, int cur_j){
if(cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1){ //当当前点越过边界或者为水时,当前岛屿面积为0
return 0;
}
grid[cur_i][cur_j] = 0; //将当前位置置为0,防止重复访问
int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0, 0};
int ans = 1; //初始化为1 因为前面if时如果当前点不为土地会直接返回0
for(int i = 0; i < 4; ++i){
int next_i = cur_i + di[i];
int next_j = cur_j + dj[i];
ans += dfs(grid, next_i, next_j); //深度遍历水平垂直四个方向直到没有相邻的1
}
return ans;
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int ans = 0;
for(int i = 0; i != grid.size(); ++i){
for(int j = 0; j != grid[0].size(); ++j){
ans = max(ans, dfs(grid, i ,j));
}
}
return ans;
}
};