130. 被围绕的区域

原题

https://leetcode.cn/problems/surrounded-regions/description/

思路

深度优先搜索

复杂度

时间:O(mn)
空间:O(m
n)

Python代码

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        m, n = len(board), len(board[0])

        def dfs(i, j):
            if 0 <= i <= m-1 and 0 <= j <= n-1 and board[i][j] == 'O':
                #  标记替换为 'M'
                board[i][j] = 'M'
                # 搜索四周
                dfs(i, j-1)
                dfs(i, j+1)
                dfs(i-1, j)
                dfs(i+1, j)
            else:
                return            
    
        # 对四周的'O'进行深度搜索
        for j in range(n):
            if board[0][j] == 'O':
                dfs(0, j)
            if board[m-1][j] == 'O':
                dfs(m-1, j)
        for i in range(m):
            if board[i][0] == 'O':
                dfs(i, 0)
            if board[i][n-1] == 'O':
                dfs(i, n-1)

            
        for i in range(m):
            for j in range(n):
                # 还原
                if board[i][j] == 'M':
                    board[i][j] = 'O'
                elif board[i][j] == 'O':
                    board[i][j] = 'X'

Go代码

func solve(board [][]byte) {
	m, n := len(board), len(board[0])
	var dfs func(int, int)
	dfs = func(i int, j int) {
		if 0 <= i && i <= m-1 && 0 <= j && j <= n-1 && board[i][j] == 'O' {
			// 标记替换为 'M'
			board[i][j] = 'M'
			// 搜索四周
			dfs(i, j-1)
			dfs(i, j+1)
			dfs(i-1, j)
			dfs(i+1, j)
		}
	}
	// 对边缘的'O'进行深度搜索并标记为'M'
	for j := 0; j < n; j++ {
		if board[0][j] == 'O' {
			dfs(0, j)
		}
		if board[m-1][j] == 'O' {
			dfs(m-1, j)
		}
	}
	for i := 0; i < m; i++ {
		if board[i][0] == 'O' {
			dfs(i, 0)
		}
		if board[i][n-1] == 'O' {
			dfs(i, n-1)
		}
	}
	// 将'O' 替换为 'X'
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			// 将'M'还原为'O'
			if board[i][j] == 'M' {
				board[i][j] = 'O'
			} else if board[i][j] == 'O' {
				board[i][j] = 'X'
			}
		}
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值