0
点赞
收藏
分享

微信扫一扫

C++刷题之旅(7)

何晓杰Dev 2022-02-19 阅读 66

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;
    }
};
举报

相关推荐

0 条评论