题目描述
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
总结
SDC1:DFS,想不到效率还挺高的,还是那句话,先实现,再优化。
SDC2:并查集,虽然效率不高,但真的是一种很好的思路。
Sample Code 1
class Solution {
public void solve(char[][] board) {
if (board.length == 0) return;
int rows = board.length;
int cols = board[0].length;
for (int i = 0; i < cols; i++) {
// if (board[0][i] == 'O')
dfs(0, i, board);
// if (board[board.length - 1][i] == 'O')
dfs(board.length - 1, i, board);
}
for (int i = 1; i < rows - 1; i++) {
// if (board[i][0] == 'O')
dfs(i, 0, board);
// if (board[i][board[0].length - 1] == 'O')
dfs(i, board[0].length - 1, board);
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == '*') board[i][j] = 'O';
else if(board[i][j] == 'O') board[i][j] = 'X';
}
}
}
private void dfs(int i, int j, char[][] board) {
if (i < 0 || j < 0 || i == board.length || j == board[0].length)
return;
if (board[i][j] == '*') return;
if (board[i][j] == 'O') {
board[i][j] = '*';
dfs(i + 1, j, board);
dfs(i, j + 1, board);
dfs(i, j - 1, board);
dfs(i - 1, j, board);
}
}
}
Sample Code 2
class Solution {
int rows, cols;
public void solve(char[][] board) {
if(board == null || board.length == 0) return;
rows = board.length;
cols = board[0].length;
UnionFind uf = new UnionFind(rows * cols + 1);
int dummyNode = rows * cols;
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(board[i][j] == 'O') {
if(i == 0 || i == rows-1 || j == 0 || j == cols-1) {
uf.union(dummyNode,node(i,j));
}else {
if(board[i-1][j] == 'O') uf.union(node(i,j), node(i-1, j));
if(board[i+1][j] == 'O') uf.union(node(i,j), node(i+1, j));
if(board[i][j-1] == 'O') uf.union(node(i,j), node(i, j-1));
if(board[i][j+1] == 'O') uf.union(node(i,j), node(i, j+1));
}
}
}
}
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(uf.isConnected(node(i,j), dummyNode)) {
board[i][j] = 'O';
}else {
board[i][j] = 'X';
}
}
}
}
int node(int i, int j) {
return i * cols + j;
}
}
class UnionFind {
int [] parents;
public UnionFind(int totalNodes) {
parents = new int[totalNodes];
for(int i = 0; i < totalNodes; i++) {
parents[i] = i;
}
}
void union(int node1, int node2) {
int root1 = find(node1);
int root2 = find(node2);
if(root1 != root2) {
parents[root2] = root1;
}
}
int find(int node) {
while(parents[node] != node) {
parents[node] = parents[parents[node]];
node = parents[node];
}
return node;
}
boolean isConnected(int node1, int node2) {
return find(node1) == find(node2);
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions