题目
给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。
两个网格块属于同一 连通分量 需满足下述全部条件:
两个网格块颜色相同
在上、下、左、右任意一个方向上相邻
连通分量的边界 是指连通分量中满足下述条件之一的所有网格块:
在上、下、左、右任意一个方向上与不属于同一连通分量的网格块相邻
在网格的边界上(第一行/列或最后一行/列)
请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。
解析
题目给了一个整数矩阵 grid,三个整数 row、col 和 color,矩阵 grid可以想象成一个图片,每个格子上的值就是这个格子的颜色,要求是获取用指定颜色color对 grid[row][col] 的这一片的边界修改,最后返回该矩阵。
比如当grid为grid = [[1,2,2],[2,3,2]], row = 0, col = 1, color = 3时
主要的两个概念是连通变量和连通边界变量,连通变量是和指定变量颜色相同并且相连的变量,连通边界变量是连通变量中处于和指定变量颜色相同并且相连的这一片变量的边界,也就是在矩阵边上或者在不同颜色的变量边上。
代码
class Solution {
//连通变量集合
Set<GridPosition> connects = new HashSet<>();
//遍历过的连通变量
Set<GridPosition> useConnects = new HashSet<>();
//边界变量集合
Set<GridPosition> bound = new HashSet<>();
public int[][] colorBorder(int[][] grid, int row, int col, int color) {
//获取矩阵长宽
int rowLength = grid.length;
int colLength = grid[0].length;
//判断该位置的变量是否为边界变量,与该变量连接的上下左右变量是否为连通变量
getboundary(grid, row, col, rowLength, colLength);
//遍历连通变量集合,找出其中的边界变量
while (connects.size() != useConnects.size()) {
GridPosition[] t = new GridPosition[connects.size()];
GridPosition[] objects = connects.toArray(t);
for (GridPosition connect : objects) {
//跳过遍历过的连通变量
if (useConnects.contains(connect)) {
continue;
}
getboundary(grid, connect.getRow(), connect.getCol(), rowLength, colLength);
useConnects.add(connect);
}
}
//遍历边界变量集合,变色
for (GridPosition gridPosition : bound) {
grid[gridPosition.getRow()][gridPosition.getCol()] = color;
}
return grid;
}
private void getboundary(int[][] grid, int row, int col, int rowLength, int colLength) {
int i = grid[row][col];
if (row - 1 >= 0) {
if (grid[row - 1][col] == i) {
connects.add(new GridPosition(row - 1, col));
} else {
bound.add(new GridPosition(row, col));
}
} else {
bound.add(new GridPosition(row, col));
}
if (col - 1 >= 0) {
if (grid[row][col - 1] == i) {
connects.add(new GridPosition(row, col - 1));
} else {
bound.add(new GridPosition(row, col));
}
} else {
bound.add(new GridPosition(row, col));
}
if (row + 1 < rowLength) {
if (grid[row + 1][col] == i) {
connects.add(new GridPosition(row + 1, col));
} else {
bound.add(new GridPosition(row, col));
}
} else {
bound.add(new GridPosition(row, col));
}
if (col + 1 < colLength) {
if (grid[row][col + 1] == i) {
connects.add(new GridPosition(row, col + 1));
} else {
bound.add(new GridPosition(row, col));
}
} else {
bound.add(new GridPosition(row, col));
}
}
class GridPosition {
private int row;
public GridPosition(int row, int col) {
this.row = row;
this.col = col;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
private int col;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GridPosition that = (GridPosition) o;
return row == that.row && col == that.col;
}
@Override
public int hashCode() {
return Objects.hash(row, col);
}
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coloring-a-border
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。