130. 被围绕的区域(DFS)

130. 被围绕的区域

  • 因为和边界连接的’O’不会改变,所以先从最层开始用DFS进行预处理,与边界连接的’O’做标记,预处理完再DFS进行改变。

  • 空间复杂度O(M*N)

  • 时间复杂度O(M*N)

class Solution {
	int res = Integer.MIN_VALUE;
	int[][] dir = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
	int r;
	int c;
	int[][] vis;
	public void solve(char[][] board) {
		//board小于两行:所有的O都在边界,直接返回
        if(board.length <= 2 || board == null)
            return;
		r = board.length;	//行
		c = board[0].length;//列
		vis = new int[r][c];
		for (int i = 0; i < r; i++) {
			if(board[i][0] == 'O' && vis[i][0] == 0) {
				predfs(i, 0, board);
			}
			if(board[i][c-1] == 'O' && vis[i][c-1] == 0) {
				predfs(i, c-1, board);
			}
		}
		for (int i = 0; i < c; i++) {
			if(board[0][i] == 'O' && vis[0][i] == 0) {
				predfs(0, i, board);
			}
			if(board[r-1][i] == 'O' && vis[r-1][i] == 0) {
				predfs(r-1, i, board);
			}
		}
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if (board[i][j] == 'O' && vis[i][j] != 1) {
					dfs(i, j, board);
				}
			}
		}
		return;
	}

	//预处理
	private void predfs(int i, int j, char[][] board) {
		vis[i][j] = 1;	//边界标记
		for (int[] d : dir) {
			int newx = i + d[0];
			int newy = j + d[1];
			if (newx >= 0 && newx < r && newy >= 0 && newy < c) {
				if(board[newx][newy] == 'O' && vis[newx][newy] != 1)
					predfs(newx, newy, board);
			}
		}		
	}


	public void dfs(int i, int j, char[][] board) {
		board[i][j] = 'X';
		for (int[] d : dir) {
			int newx = i + d[0];
			int newy = j + d[1];
			if (newx >= 0 && newx < r && newy >= 0 && newy < c) {
				if(board[newx][newy] == 'O' && vis[newx][newy] != 1)
					dfs(newx, newy, board);
			}
		}
		return;
	}
}
发布了56 篇原创文章 · 获赞 4 · 访问量 1657

猜你喜欢

转载自blog.csdn.net/qq_41342326/article/details/104439912
今日推荐