目录
编辑
一,图像渲染
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);}}} };