递归算法学习——图像渲染,岛屿的数量,最大的岛屿

目录

​编辑

一,图像渲染

1.题意

2.解释

3.题目接口

4.解题思路及代码

二,岛屿的数量

1.题意

2.解释

3.题目接口

4.解题思路及代码

三,最大的岛屿

1.题意

2.解释

 3.题目接口

4.解题代码即思路


 

一,图像渲染

1.题意

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。

你也被给予三个整数 sr ,  sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。

为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。

最后返回 经过上色渲染后的图像 

2.解释

这一道题要让我们做的便是从一个指定的位置出发将所有和这个位置相同值的一个位置改为指定的新的值,包括这个指定的节点。

3.题目接口

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
        
    }
};

4.解题思路及代码

这道题的解决方法其实也挺简单的。还是和我们之前写过的题目解题方式是一样的,还是通过深度优先搜索的方式来解决。在这里要注意的一点便是当我们指定的位置的值和要修改的的值相等时便不需要修改了,直接返回便是。如若没有这一步便会让代码陷入死循环。现在来写代码:

lass Solution {
public:
    int m,n;
    int num;
    int dx[4] = {0,0,1,-1},dy[4] = {-1,1,0,0};
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
      if(color == image[sr][sc])//当改的位置的值和新值相同的便直接返回
      {
          return image;
      }


       m = image.size();
       n = image[0].size();
       num = image[sr][sc];
       dfs(image,sr,sc,color);
       return image; 
    }

    void dfs(vector<vector<int>>& image,int i,int j,int newcolor)
    {
        image[i][j] = newcolor;//该符合条件的位置的值

        for(int k = 0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&image[x][y]==num)
            {
                dfs(image,x,y,newcolor);
            }
        }
    }
};

代码如上,其实和我们之前写的代码的样子是很像的。就是条件有所改变。

二,岛屿的数量

1.题意

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

2.解释

通过题目其是很容易发现这道题的目的便是让我们找到在一个二维数组中找出由字符‘1’连在一起组成的区域有几个。在统计完个数以后返回便是。

3.题目接口

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        
    }
};

4.解题思路及代码

这道题的解题思路还是要用到深度优先遍历。解题代码还是与之前的前几道题的代码相似,只不过就是条件改变了。看看代码便知道了,代码如下:

class Solution {
public:
    int m,n,num;
    vector<vector<bool>>used;
    int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};

    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
        used = vector<vector<bool>>(m,vector<bool>(n));

        for(int i = 0;i<m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(grid[i][j]=='1'&&!used[i][j])//注意是字符不是数字
                {
                  num++;
                  dfs(grid,i,j);
                }
            }
        }

        return num;

    }

    void dfs(vector<vector<char>>&grid,int i,int j)
    {
        for(int k = 0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'&&!used[x][y])
            {
                used[x][y] = true;
                dfs(grid,x,y);
            }
        }
    }
};

怎么样?是不是和之前我们写的代码的样子非常的相似啊?只不过是某些条件的改变于是这段代码的解决方式便改变了。在这里要注意这个二维数组里面放的是字符而不是数字。

三,最大的岛屿

1.题意

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

2.解释

这道题便是要我们在由1连成的多个区域里面找出那个最大的区域。

 3.题目接口

class Solution {
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {

    }
};

4.解题代码即思路

这道题其实和前面的求岛屿的数量的解题代码是差不多的,我们只要在前面代码的基础上改几处代码便可以了。现在来看看代码:

class Solution {
public:
    int m,n,num,Maxnum;
    vector<vector<bool>>used;
    int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};

    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        used = vector<vector<bool>>(m,vector<bool>(n));

        for(int i = 0;i<m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(grid[i][j]==1&&!used[i][j])//注意是数字
                {
                  num = 1;
                  used[i][j] = true;
                  dfs(grid,i,j);
                }
            }
        }

        return Maxnum;
    }

    void dfs(vector<vector<int>>&grid,int i,int j)
    {
        Maxnum = max(num,Maxnum);//每次都将Maxnum更新为最大的那个数
        for(int k = 0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&!used[x][y])
            {
                num++;
                used[x][y] = true;
                dfs(grid,x,y);
            }
        }
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值