目录
前言
近几日天气可太热了,贴心的博主给大家带来了夏日必备解暑神器——算法题!
解暑神器1:图像渲染(LeetCode第733题)
题目描述
有一幅以m*n的二维整数数组表示的图画 image,其中 image[i][j] 表示该图画的像素值大小。
你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行上色填充 。
为了完成上色工作 ,从初始像素开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。
最后返回经过上色渲染后的图像 。
示例:
题目分析:
通俗来讲,题目的意思就是给你一个二维数组,数组中的数字代表不同的颜色,现在给你一个起始位置和一个新颜色,要你从起始位置开始,不断向上下左右渲染新颜色。
此处渲染颜色需满足两个条件:
①、起始位置的颜色必须与新颜色不同;
②、被渲染的周围颜色渲染前应与起始位置的颜色相同。
代码如下:
//通过下方两个数组改变目标,得到初始位置的上下左右
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
void dfs(int** image,int imageSize,int* imageColSize,int x,int y,int curcolor,int newcolor)
{
if(x<0 || x>=imageSize || y<0 || y>=imageColSize[0])//判断是否越界
{
return;
}
if(image[x][y]==curcolor)
{
image[x][y]=newcolor;//替换颜色
for(int i=0;i<4;i++)//更换为邻接位置,判断是否需要替换颜色
{
int nx=x+dx[i];
int ny=y+dy[i];
dfs(image,imageSize,imageColSize,nx,ny,curcolor,newcolor);//递归
}
}
return;
}
int** floodFill(int** image, int imageSize, int* imageColSize, int sr, int sc, int color, int* returnSize, int** returnColumnSizes)//row:行;col:列
{
*returnSize=imageSize;
*returnColumnSizes=imageColSize;
if(image[sr][sc]!=color)//如果初始位置颜色不需要更改,则不需要渲染
{
dfs(image,imageSize,imageColSize,sr,sc,image[sr][sc],color);
}
return image;
}
这段代码采取了深度优先搜索的思想,通过dfs函数的递归来解决问题。
解暑神器2:岛屿的最大面积(LeetCode第695题)
题目描述:
给你一个大小为m*n的二进制矩阵 grid 。
岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
示例:
题目分析:
这道题跟图像渲染的解法是基本没啥变化的,题目的意思很简单,首先你从第一个位置(0,0)开始,如果是土地(1),则开始扩散寻找上下左右是否有土地(1),不断扩大直到没有土地为止,返回获得土地的最大值。
代码如下:
int dfs(int** grid,int gridSize,int* gridColSize,int row,int col)
{
//越界处理
if(row<0||row>=gridSize||col<0||col>=*gridColSize||grid[row][col]==0)
{
return 0;
}
//每次计算后清零,防止多次计算
grid[row][col]=0;
int ans=1;
int x[4]={0,0,1,-1};
int y[4]={1,-1,0,0};
for(int k=0;k<4;k++)
{
ans+=dfs(grid,gridSize,gridColSize,row+x[k],col+y[k]);
}
return ans;
}
int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize){
int area=0,j,max=0,i=0;
//遍历整个二维矩阵
for(;i<gridSize;i++)
{
for(j=0;j<*gridColSize;j++)
{
area=dfs(grid,gridSize,gridColSize,i,j);//计算当前位置延伸出去的土地数量
max=max>area?max:area;//保存最大值
}
}
return max;
}
或者下面这个也行,看个人喜好
int dfs(int** grid,int gridSize,int* gridColSize,int row,int col)
{
//越界处理
if(row<0||row>=gridSize||col<0||col>=*gridColSize||grid[row][col]==0)
{
return 0;
}
//每次计算后清零,防止多次计算
grid[row][col]=0;
return 1+dfs(grid,gridSize,gridColSize,row-1,col)
+dfs(grid,gridSize,gridColSize,row+1,col)
+dfs(grid,gridSize,gridColSize,row,col-1)
+dfs(grid,gridSize,gridColSize,row,col+1);
}
int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize){
int area=0,j,max=0,i=0;
//遍历整个二维矩阵
for(;i<gridSize;i++)
{
for(j=0;j<*gridColSize;j++)
{
area=dfs(grid,gridSize,gridColSize,i,j);//计算当前位置延伸出去的土地数量
max=max>area?max:area;//保存最大值
}
}
return max;
}
部分图解过程: