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

目录

​编辑

一,图像渲染

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);}}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108825.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试题】前端开发中如何高效渲染大数据量?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 【国庆头像】- 国庆爱国 程序员头像&#xff01;总有一款适合你&#xff01; 在日常工作中&#xff0c;较少的能遇到一次性往页面中插入大量数据的场景…

通过Git Bash将本地文件上传到本地github

1. 新建一个仓库&#xff08; Repository&#xff09; 1.1登录Github&#xff0c;点击个人头像&#xff0c;点击Your repositories&#xff0c;点击New。 1.2 填写信息 Repository name: 仓库名称 Description(可选): 仓库描述介绍,不是必填项目。~~建议填写上哦&#xff01;…

IIC协议理解及驱动OLED屏

1.iic协议是串行半双工总线&#xff0c;主要应用于近距离&#xff0c;低速芯片之间通信。 两根线 SCL SDA 2.IIC总线通讯过程 1.主机发送起始信号占用总线 2.主机发送一个字节数据指明从机地址和后续字节的传输方向。 七位地址位一位来调节后续字节传输方向 最后一位&…

echarts静态饼图

<div class"cake"><div id"cakeChart"></div></div> import * as echarts from "echarts";mounted() {this.$nextTick(() > {this.getCakeEcharts()})},methods: {// 饼状图getCakeEcharts() {let cakeChart echart…

Day_14 > 指针进阶(3)> bubble函数

目录 1.回顾回调函数 2.写一个bubble_sort函数 2.1认识一下qsort函数 ​编辑2.2写bubble_sort函数 今天我们继续深入学习指针 1.回顾回调函数 我们回顾一下之前学过的回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;…

某计费管理系统任意文件读取漏洞

文章目录 声明一、漏洞描述二、漏洞复现声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、漏洞描述 蓝海…

前端面试要点

0914 JScript深拷贝和浅拷贝&#xff08;js解构赋值算哪个&#xff1f;&#xff09; 深拷贝和浅拷贝 回流和重绘 回流和重绘 webpack打包流程 Webpack打包 虚拟DOM 虚拟DOM git合并分支 git合并分支 CSS盒子模型 CSS盒子模型 0911 WebPack分包 webpack分包 ts泛型 ts泛型 优化…

Java入坑之代理

一、代理模式和静态代理 1.1代理模式 代理模式 - Proxy Pattern, 23个经典模式的一种&#xff0c;又称委托模式 -为目标对象提供(包装)了一个代理&#xff0c;这个代理可以控制对目标对象的访问 外界不用直接访问目标对象&#xff0c;而是访问代理对象&#xff0c;由代理对象再…

重建大师提交空三后引擎状态是等待,怎么开启?

答&#xff1a;图片中这是在自由网空三阶段&#xff0c;整个AT都是等待中&#xff0c;可以修改任务目录和监控目录看一下&#xff0c;先设置引擎&#xff0c;再提交空三。

蓝牙资讯|苹果新款AirPods Pro支持Vision Pro无损音频和IP54防水防尘

苹果公司宣称&#xff0c;USB-C 能够带来更多灵活性&#xff0c;现在用户可以使用手机的 USB-C 接口&#xff0c;为 AirPods Pro 耳机盒充电。 虽然苹果没有详细介绍这款耳机&#xff0c;但在今天的新闻稿中依然透露了一些不一样的地方&#xff0c;例如新款 AirPods Pro 2 升…

k8s node环境部署(三)

1、添加node1、node2环境 前面配置master环境的截图最后一段 复制下来 分别在node主机执行 kubeadm join 192.168.37.132:6443 --token p5omh3.cqjqt8ymrwkdn2fc \ --discovery-token-ca-cert-hash sha256:608a1cbadd060cfdeac2fae84c19609061b750ab51bf9a19887ff7ea…

基于小程序的理发店预约系统

一、项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率&#xff0c;给人们带来很多的方便。计算机技术从很大的程度上解放了人们的双手&#xff0c;并扩大了人们的活动范围&#xff0c;是人们足不出户就可以通过电脑进行各种事情的管理。信息系…