【刷题打卡】1034. 边界着色

147 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、题目描述:

1034. 边界着色 - 力扣(LeetCode) (leetcode-cn.com)

给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 rowcolcolor 。网格中的每个值表示该位置处的网格块的颜色。

两个网格块属于同一 连通分量 需满足下述全部条件:

  • 两个网格块颜色相同
  • 在上、下、左、右任意一个方向上相邻

连通分量的边界 是指连通分量中满足下述条件之一的所有网格块:

  • 在上、下、左、右任意一个方向上与不属于同一连通分量的网格块相邻
  • 在网格的边界上(第一行/列或最后一行/列)

请你使用指定颜色 color 为所有包含网格块 grid[row][col]连通分量的边界 进行着色,并返回最终的网格 grid

 

示例 1:

输入:grid = [[1,1],[1,2]], row = 0, col = 0, color = 3
输出:[[3,3],[3,2]]

示例 2:

输入:grid = [[1,2,2],[2,3,2]], row = 0, col = 1, color = 3
输出:[[1,3,3],[2,3,3]]

示例 3:

输入:grid = [[1,1,1],[1,1,1],[1,1,1]], row = 1, col = 1, color = 2
输出:[[2,2,2],[2,1,2],[2,2,2]]

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • 1 <= grid[i][j], color <= 1000
  • 0 <= row < m
  • 0 <= col < n  

二、思路分析:

题目的意思是:将一个component的边界方块染色,即将其赋值为color,并返回染色后的Grid

由此牵涉两个定义:

什么是一个component?

什么是一个component的边界方块?

如题意,一个component即上下左右四个方向相邻的同色方块所在区域

一个component的边界方块是要么在第一/最后一行或者列,要么至少跟一个其他区域的方块相邻

解题思路

首先从起始节点开始,DFS

若遇到边界节点,则染色之

三、AC 代码:

class Solution {
    
    public int[][] colorBorder(int[][] grid, int r0, int c0, int color) {
        int row = grid.length;
        int col = grid[0].length;
       
        int[][] newGrid = new int[row][col]; //在一个新的grid上染色,
        int[][] visited = new int[row][col];
        //copy data
        for(int i =0 ;i< row;i++)
            for(int j =0;j< col;j++){
                newGrid[i][j] = grid[i][j];
                visited[i][j] = 0;
        }
                

        dfs(grid,newGrid, visited,r0, c0, grid[r0][c0],color);
        return newGrid;
    }
    void dfs(int[][] grid, int[][] newGrid, int[][] visited,int i , int j, int rawColor, int newColor){
        int row = grid.length;
        int col = grid[0].length;
        if(i< 0 || i > row -1 || j < 0 || j > col -1 || grid[i][j] != rawColor)
            return;

        
        if(visited[i][j] == 0 ){
            if(isBorder(grid,i,j)) 
                newGrid[i][j] = newColor;  //若为边界则染色之
                
            visited[i][j] = 1;
            dfs(grid,newGrid,visited,i-1,j,rawColor,newColor);
            dfs(grid,newGrid,visited,i+1,j,rawColor,newColor);
            dfs(grid,newGrid,visited,i,j-1,rawColor,newColor);
            dfs(grid,newGrid,visited,i,j+1,rawColor,newColor);
        }
            
        
        
    }
    boolean isBorder(int[][] grid, int i , int j){
        // 判断是否为边界 1.若在网格边界则返回true 2.对于不在网格边界的方块:若四周皆为本区域则返回false,否则返回true
        int row = grid.length;
        int col = grid[0].length;
        int color = grid[i][j]; // rawColor
        
        if(i ==0 || i == row -1 || j ==0 || j == col -1)
            return true;  //boundary of the grid
        if(grid[i-1][j] == color && grid[i+1][j] == color && grid[i][j-1] == color && grid[i][j+1] == color)
            return false;  //inner grid
        else
            return true;
    }
}