1.采用BFS或DFS即可。
2.和传统的找联通不一样,本题要求对边界上色,即BFS或DFS均需要保留上一次的坐标,因为判断(x,y)是不是边界需要根据(x±1,y±1)判断,倘若(x±1,y±1)判定"成功",则对(x,y)着色,这就是本题的最大不同。
3.本题我的BFS貌似存在重复上色现象,即有的边界可能被上色多次,故不可以使用取反值进行特殊标记,找到了直接在grid里修改即可。
1.DFS(感觉比BFS容易)
class Solution {
public int[][] grid;
public boolean[][] vis;
public int orginal;
public int m,n,color;
public int[][] colorBorder(int[][] grid, int row, int col, int color) {
m = grid.length;
n=grid[0].length;
vis= new boolean[m][n];
this.grid=grid;
this.color=color;
orginal=grid[row][col];
func(row,col,0,0);
return grid;
}
public void func(int row,int col , int rp , int cp){
if((row>=0 && row<m) && (col>=0 && col<n)){
if(!vis[row][col]){
if(grid[row][col]==orginal){
vis[row][col]=true;
func(row-1,col,row,col);
func(row+1,col,row,col);
func(row,col-1,row,col);
func(row,col+1,row,col);
}
else{
grid[rp][cp]=color;
}
}
}
else{
grid[rp][cp]=color;
}
}
}
2.BFS
class Solution {
public int[][] grid;
public boolean[][] vis;
public Deque<int[]> q;
public int m,n,color,orginal;
public int[][] colorBorder(int[][] grid, int row, int col, int color) {
m = grid.length;
q=new ArrayDeque<>(); //Java 使用ArrayDeque模拟queue,基础操作 isEmpty(),poll()
n=grid[0].length;
vis= new boolean[m][n]; //布尔数组默认为False;
this.grid=grid;
this.color=color;
orginal=grid[row][col];
int[][] dir={{0,-1},{0,1},{1,0},{-1,0}};
q.offer(new int[]{row,col});
vis[row][col]=true;
while(!q.isEmpty()){
int[] res=q.poll();
int x=res[0],y=res[1];
for(int[] i: dir){
int nx=x+i[0];
int ny=y+i[1];
if((0<=nx && nx<m)&& (0<=ny && ny<n)){
if(!vis[nx][ny]){
if(grid[nx][ny]==orginal){
vis[nx][ny]=true;
q.offer(new int[]{nx,ny});
}
else{
grid[x][y]=color;
}
}
}
else{
grid[x][y]=color;
}
}
}
return grid;
}
}