1034. 边界着色(JAVA)

1034. 边界着色

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;
    }
     
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值