ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

元宝 LeetCode 130. 被围绕的区域 Golang实现

元宝    LeetCode 130. 被围绕的区域 Golang实现 LeetCode 130 的核心不是「找被包围的 O」而是反过来先保住所有和边界连通的 O剩下的 O 才是真被包围的。思路DFS 反向标记扫描矩阵四条边界第一行、最后一行、第一列、最后一列边界上遇到“‘O’”就 DFS/BFS 把与它连通的所有“‘O’” 临时改成“‘A’”表示安全再遍历整个矩阵“‘A’” → 恢复成“‘O’”还是“‘O’” → 说明没连到边界翻成“‘X’”“‘X’” 不动时间复杂度“O(mn)每个格子最多访问两次空间复杂度递归栈最坏O(mn)”。Golang DFS 实现面试推荐func solve(board [][]byte) {if len(board) 0 || len(board[0]) 0 {return}m, n : len(board), len(board[0])var dfs func(i, j int) dfs func(i, j int) { if i 0 || i m || j 0 || j n { return } if board[i][j] ! O { return } board[i][j] A // 标记安全 dfs(i1, j) dfs(i-1, j) dfs(i, j1) dfs(i, j-1) } // 上下两边 for j : 0; j n; j { dfs(0, j) dfs(m-1, j) } // 左右两列 for i : 0; i m; i { dfs(i, 0) dfs(i, n-1) } // 二次扫描 for i : 0; i m; i { for j : 0; j n; j { if board[i][j] A { board[i][j] O } else if board[i][j] O { board[i][j] X } } }}⚠️ 递归 DFS 在 200×200 全 O 时会栈较深LeetCode 一般能过工程上更稳的是下面 BFS 版。Golang BFS 实现无递归栈风险func solve(board [][]byte) {if len(board) 0 || len(board[0]) 0 {return}m, n : len(board), len(board[0])queue : [][2]int{}// 边界 O 入队并标记 add : func(i, j int) { if board[i][j] O { board[i][j] A queue append(queue, [2]int{i, j}) } } for j : 0; j n; j { add(0, j) add(m-1, j) } for i : 0; i m; i { add(i, 0) add(i, n-1) } dirs : [][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}} for len(queue) 0 { x, y : queue[0][0], queue[0][1] queue queue[1:] for _, d : range dirs { nx, ny : xd[0], yd[1] if nx 0 nx m ny 0 ny n board[nx][ny] O { board[nx][ny] A queue append(queue, [2]int{nx, ny}) } } } for i : 0; i m; i { for j : 0; j n; j { if board[i][j] A { board[i][j] O } else if board[i][j] O { board[i][j] X } } }}易错点边界遍历别漏四条边都要扫只扫一行会漏临时标记用“‘A’”不要用“‘T’” 之类容易和题目字符混也别用“‘X’”/“‘O’”原地修改题目不要求返回值直接改“board”空矩阵 / 单行单列开头判空单列时边界就是全部元素示例跑一遍输入X X X XX O O XX X O XX O X X底部“(3,1)” 的 O 在边界上 → 连通块保留中间“(1,1),(1,2),(2,2)” 的 O 不连边界 → 翻 X输出X X X XX X X XX X X XX O X X要不要我顺便给你一版 并查集Union-Find 实现在「连通块批量合并」这类变题里更通用。
返回列表