十四天算法快速入门第七天之「广度优先搜索 / 深度优先搜索」

写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~

目录

题目一:733. 图像渲染  

题目描述:

题目分析:

题解代码:

题目二:695. 岛屿的最大面积 

题目描述:

题目分析:

题解代码:


题目一: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;
    }
};

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kano_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值