leetcode130被围绕的区域

leetcode 130 Surrounded Regions

Posted by BY on July 3, 2020

前言

持续更新了

正文

问题来源

本问题来自leetcode上的130题。

问题描述

给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

示例 1:

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

分析:

记录从边上能够访问的位置,若不能到达则标记为’X’

func solve(board [][]byte)  {
	if board == nil || 0 == len(board) || 0 == len(board[0]) {
		return
	}
    v := make([][]bool, len(board))
    for i := 0; i < len(board); i++ {
    	v[i] = make([]bool, len(board[0]))
    }
    for i := 0; i < len(board[0]); i++ {
    	dfs(board, v, 0, i)
    	dfs(board, v, len(board)-1, i)
    }
    for i := 0; i < len(board); i++ {
    	dfs(board, v, i, 0)
    	dfs(board, v, i, len(board[0])-1)
    }
    for i := 0; i < len(board); i++ {
    	for j := 0; j < len(board[0]); j++ {
    		if !v[i][j] {
    			board[i][j] = 'X'
    		}
    	}
    }
}

func dfs(board [][]byte, visit [][]bool, i, j int) {
	if i >= len(board) || i < 0 || j >= len(board[0]) || j < 0 || visit[i][j] || board[i][j] == 'X' {
		return
	}
	visit[i][j] = true
	dfs(board, visit, i, j-1)
	dfs(board, visit, i-1, j)
	dfs(board, visit, i, j+1)
	dfs(board, visit, i+1, j)
}

其实可以不用额外空间来记录是否能够访问,能够访问则标记为不为’X’或’O’的标记

func solve(board [][]byte)  {
    if len(board) == 0 {
        return
    }
    for i := 0; i < len(board[0]); i++ { // 围绕着周围做Bfs
        dfs(0, i, board)
        dfs(len(board) - 1, i, board)
    }
    for i := 0; i < len(board); i++ { 
        dfs(i, 0, board)
        dfs(i, len(board[0]) - 1, board)
    }
    for i := 0; i < len(board); i++ {
        for j := 0; j < len(board[0]); j++ {
            if board[i][j] == 'V' {
                board[i][j] = 'O'
            } else {
                board[i][j] = 'X'
            }
        }
    }
}

func dfs(i int, j int, board[][]byte) {
    if i < 0 || i >= len(board) || j < 0 || j >= len(board[0]) {
        return
    } else if board[i][j] == 'X' || board[i][j] == 'V' { //已访问过或者不等于O
        return 
    }
    board[i][j] = 'V'
    dfs(i - 1, j, board)
    dfs(i + 1, j, board)
    dfs(i, j - 1, board)
    dfs(i, j + 1, board)
}

总结:

勤思考。

结语

不管怎么样好好加油。