Leetcode洪泛问题的解决方案

2020-05-13 00:39:15

为了更清楚地了解问题要我们做什么,首先,最好是将多维数组元素分解成一个正方形结构,例如,下图显示了[[1,1,1],[1,1,0]]的分解情况,例如,下图显示了[[1,1,1],[1,1,0]]的分解情况:

现在我们已经将元素分解为行和列,如上图所示,对问题的解释是这样的:给定特定的开始行(Sr)和开始列(Sc),该开始行(Sr)和开始列(Sc)被假定为开始像素,并且被赋予要用于替换的新颜色(NewColor),将该开始像素(sr,sc)改变为新颜色(NewColor),并且还改变其邻域(4向相同颜色的开始像素)。

例如,假设上图中圈出的数字是起始索引,则下图准确显示了整体填充将采取的步骤:

因此,步骤1从中间开始,作为起始像素,将自身更改为新颜色,在本例中为‘2’。它检查它的邻居(左、右、上、下),替换那些与起始像素在更改为新颜色(2)之前具有相同编号(即1)的像素。所以只要他们是邻居,它就会把所有的1改成2。然后,它将“战斗”转移到它的左侧邻居(第1纵队),以经历同样的过程。

步骤2,将其顶部和底部邻域更改为2,因为这些邻域的编号与其自身更改前的初始编号相同。请注意,步骤2没有左侧邻居。

如果您注意到了,可以将左右相邻视为列,而将顶部和底部视为行。

在这类问题中,脑海中浮现的第一个想法是递归。

我们需要跟踪初始颜色,然后使用递归遍历所有路径。

类解决方案{public int[][]fuldFill(int[][]image,int sr,int sc,int newColor){if(image[sr][sc]==newColor)return image;Flood(image,image[sr][sc],newColor,sr,sc);return image;}public void Fill(int[][]image,int color,int newColor,int sr,int sc){if(sr<;0||sc<;0。=image[0].length||image[sr][sc]!=color){return;}image[sr][sc]=newColor;int topRowNeighbour=sr-1;int bottomRowNeighbour=sr+1;int leftColumnNeigbour=sc-1;int rightColumnNeighbour=sc+1;FLOAD(image,color,newColor,topRowNeighbour,sc);FLOAD(image,color,}}