当前位置: 首页 > 后端技术 > Python

LeetCode733:图像渲染flood-fill

时间:2023-03-26 00:33:13 Python

题目:有一张图片,用一个二维整数数组表示,每个整数代表图片的像素值,值在0到65535之间。一张图片表示为一个二维整数数组,每个整数代表图像的像素值(从0到65535)。给你一个坐标(sr,sc)代表图像渲染开始的像素值(行,列)和一个新的颜色值newColor让你重新着色图像。给定表示填充的起始像素(行和列)的坐标(sr,sc)和像素值newColor,“填充”图像。在上、下、左、右四个方向上连接与初始坐标相同像素值的像素点,然后记录这四个方向上的合格像素点及其对应的四个方向上像素值相同的连接像素点初始坐标,...,重复该过程。将所有记录像素的颜色值更改为新的颜色值。要执行“洪水填充”,请考虑起始像素,加上与起始像素颜色相同的4方向连接到起始像素的任何像素,加上与这些像素4方向连接的任何像素(也与起始像素),依此类推。用newColor替换所有上述像素的颜色。最后返回颜色渲染后的图像。最后返回修改后的图片。示例1:输入:image=[[1,1,1],[1,1,0],[1,0,1]]sr=1,sc=1,newColor=2输出:[[2,2,2],[2,2,0],[2,0,1]]解析:图像中间,(坐标(sr,sc)=(1,1)),所有符合条件的像素的颜色路径上的点都改为2。注意右下角的像素点没有改为2,因为它不是上下左右四个方向与初始点相连的像素点。注意:image和image[0]的长度在[1,50]范围内。给定的初始点将满足0<=sr=0)&&(j=0);}privatevoidfloodFillProcess(int[][]img,intsr,intsc,intoc,intnc){if(withinBounds(img,sr,sc)&&img[sr][sc]==oc){//当指针没有溢出且像素值为旧值时,img[sr][sc]=nc;//变为新值floodFillProcess(img,sr-1,sc,oc,nc);//递归上、下、左、右四点floodFillProcess(img,sr+1,sc,oc,nc);floodFillProcess(img,sr,sc-1,oc,nc);floodFillProcess(img,sr,sc+1,oc,nc);}}publicint[][]floodFill(int[][]image,intsr,intsc,intnewColor){intoc=image[sr][sc];如果(newColor==oc)返回图像;floodFillProcess(图像、sr、sc、oc、newColor);返回图像;}}DFS(Python):classSolution:deffloodFill(self,image:List[List[int]],sr:int,sc:int,newColor:int)->List[List[int]]:oldColor=image[sr][sc]如果oldColor==newColor:返回图像self.dfs(image,sr,sc,oldColor,newColor)返回图像defdfs(self,image:List[List[int]],sr:int,sc:int,oldColor:int,newColor:int):ifimage[sr][sc]==oldColor:image[sr][sc]=newColorifsr-1>=0:#先判别是否溢出再决定是否递归self.dfs(image,sr-1,sc,oldColor,newColor)ifsr+1=0:self.dfs(image,sr,sc-1,oldColor,newColor)如果sc+1set=newLinkedHashSet<>();//set(),避免添加重复点Queuequeue=newLinkedList<>();queue.add(loc);//将第一个初始点加入队列,记录点索引的方式为x*column+y,while(!queue.isEmpty()){inttmp=queue.poll();intr=tmp/column,c=tmp%column;//反汇编位置if(img[r][c]==oc&&!set.contains(tmp)){//像素值为旧值,并且点还没有计算img[r][c]=nc;//改成新值set.add(tmp);if(r+1=0)如果(img[r-1][c]==oc)queue.add((r-1)*column+c);如果(c+1<column)if(img[r][c+1]==oc)queue.add(r*column+c+1);如果(c-1>=0)如果(img[r][c-1]==oc)queue.add(r*column+c-1);}}}}