新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/30 8:55:37来源:尧图网络
元宝    LeetCode 130. 被围绕的区域 Rust实现
这是 LeetCode 130 题 “被围绕的区域” 的 Rust 实现。题目描述给定一个“m x n” 的矩阵“board”由字符“‘X’” 和“‘O’” 组成找到所有被“‘X’” 围绕的区域并将这些区域里所有的“‘O’” 用“‘X’” 填充。注意任何边界上的“‘O’” 以及与边界“‘O’” 相连的“‘O’” 都不会被填充。解题思路DFS深度优先搜索与 Python 版本思路一致采用逆向思维标记边界连通区从矩阵四条边界上的“‘O’” 出发利用 DFS 将所有与边界相连的“‘O’” 临时标记为“‘#’”。原地更新矩阵遍历整个矩阵将剩余的“‘O’”被完全包围的替换为“‘X’”。将标记为“‘#’” 的边界连通区还原为“‘O’”。Rust 注意事项在 Rust 中递归修改二维向量非常安全我们可以把“board” 作为可变引用“mut VecVec” 传入递归函数通过索引直接修改。为了避免“usize” 减法溢出坐标计算使用“i32” 并在访问时转换为“usize”。Rust 代码实现LeetCode 风格核心代码impl Solution {pub fn solve(board: mut VecVec) {if board.is_empty() || board[0].is_empty() {return;}let m board.len() as i32; let n board[0].len() as i32; // 定义 DFS 递归函数 fn dfs(board: mut VecVecchar, r: i32, c: i32) { let m board.len() as i32; let n board[0].len() as i32; // 越界检查 if r 0 || r m || c 0 || c n { return; } let (r_usize, c_usize) (r as usize, c as usize); // 如果不是 O直接返回已访问过或本身是 X if board[r_usize][c_usize] ! O { return; } // 标记为与边界连通 board[r_usize][c_usize] #; // 向四个方向递归 dfs(board, r 1, c); dfs(board, r - 1, c); dfs(board, r, c 1); dfs(board, r, c - 1); } // 从四条边界出发 for i in 0..m { dfs(board, i, 0); // 第一列 dfs(board, i, n - 1); // 最后一列 } for j in 0..n { dfs(board, 0, j); // 第一行 dfs(board, m - 1, j); // 最后一行 } // 重新遍历替换字符 for i in 0..m as usize { for j in 0..n as usize { if board[i][j] O { board[i][j] X; // 被包围的 O 变为 X } else if board[i][j] # { board[i][j] O; // 边界连通的还原为 O } } } }}完整可运行示例含本地测试如果你想在本地运行可以使用以下完整代码包含“main” 函数struct Solution;impl Solution {pub fn solve(board: mut VecVec) {if board.is_empty() || board[0].is_empty() {return;}let m board.len() as i32; let n board[0].len() as i32; fn dfs(board: mut VecVecchar, r: i32, c: i32) { let m board.len() as i32; let n board[0].len() as i32; if r 0 || r m || c 0 || c n { return; } let (r_usize, c_usize) (r as usize, c as usize); if board[r_usize][c_usize] ! O { return; } board[r_usize][c_usize] #; dfs(board, r 1, c); dfs(board, r - 1, c); dfs(board, r, c 1); dfs(board, r, c - 1); } for i in 0..m { dfs(board, i, 0); dfs(board, i, n - 1); } for j in 0..n { dfs(board, 0, j); dfs(board, m - 1, j); } for i in 0..m as usize { for j in 0..n as usize { if board[i][j] O { board[i][j] X; } else if board[i][j] # { board[i][j] O; } } } }}fn print_board(board: VecVec) {for row in board {for ch in row {print!({} , ch);}println!();}println!();}fn main() {// 示例 1let mut board1 vec![vec![‘X’, ‘X’, ‘X’, ‘X’],vec![‘X’, ‘O’, ‘O’, ‘X’],vec![‘X’, ‘X’, ‘O’, ‘X’],vec![‘X’, ‘O’, ‘X’, ‘X’]];println!(“示例1原始矩阵:”);print_board(board1);Solution::solve(mut board1); println!(示例1处理后:); print_board(board1); // 预期输出: // X X X X // X X X X // X X X X // X O X X // 示例 2 let mut board2 vec![vec![X]]; Solution::solve(mut board2); println!(示例2处理后: {:?}, board2); // 输出: [[X]]}编译与运行rustc main.rs -o surround_regions./surround_regions或者使用 cargo run复杂度分析时间复杂度O(m × n)其中 m 和 n 分别是矩阵的行数和列数。每个单元格最多被访问两次。空间复杂度O(m × n)最坏情况下矩阵全是“‘O’”递归调用栈的深度会达到 m × n。 延展思考避免递归栈溢出如果矩阵极大如 10^4 \times 10^4 递归 DFS 可能导致栈溢出。可以改用显式栈迭代 DFS或 队列BFS 来实现。并查集Union-Find创建一个虚拟节点代表“边界外”将所有边界上的“‘O’” 与虚拟节点合并最后检查内部“‘O’” 是否与虚拟节点连通。需要我为你提供迭代法BFS 队列的 Rust 实现或者讲解并查集解法吗
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【win11】【CMD】【网友小需求】快速删除文件夹或文件 2026/9/30 11:00:55

【win11】【CMD】【网友小需求】快速删除文件夹或文件

不多说,直接上。 在指定文件夹里,路径的输入框内,输出 cmd 回车命令提示符窗口(CMD)打开成功输出 rd /s /q "test" (要谨慎使用,毕竟是直接强制删除)直接消失不见删除 rmd…

阅读更多 →
WSL2图形显示实战:VcXsrv配置与DISPLAY排查完整指南 2026/9/30 11:00:55

WSL2图形显示实战:VcXsrv配置与DISPLAY排查完整指南

1. 为什么非要在WSL2里跑图形界面:先搞清楚显示链路是怎么回事1.1 一条最经典的报错,几乎每个人都见过装完WSL2,apt update、curl、gcc都跑得好好的,然后你想在Linux环境里开一个GUI工具——比如xterm、Qt Creator、Gazebo仿真器&…

阅读更多 →
机器人触觉感知的数据底座:PPS 电容传感矩阵技术解析 2026/9/30 11:00:48

机器人触觉感知的数据底座:PPS 电容传感矩阵技术解析

一只机械手要稳稳握住鸡蛋,不捏碎也不滑脱,依赖的不只是控制算法,还有指尖那层能“感觉轻重”的触觉传感器(tactile sensor)。在具身智能与灵巧手研发中,机器人触觉感知正从加分项变成基础设施。 技术内核&…

阅读更多 →
Java线程生命周期全解析:从NEW到TERMINATED! 2026/9/30 11:00:25

Java线程生命周期全解析:从NEW到TERMINATED!

全文目录:开篇语一、线程生命周期与状态转换1. NEW:刚创建,还没“开工”2. RUNNABLE:正在 CPU 上排队 / 跑着3. BLOCKED:等着进“临界区”的锁4. WAITING:无限期等待某个条件5. TIMED_WAITING:带…

阅读更多 →
深度拆解五大IO模型:从阻塞到epoll,高并发服务如何少踩坑 2026/9/30 11:00:25

深度拆解五大IO模型:从阻塞到epoll,高并发服务如何少踩坑

先聊一个我在面试里经常问的问题:一个 read 调用打到内核里,数据没到的时候,你的程序到底在等什么?这个问题看着基础,但能讲清楚的人真不多。很多人都会背“阻塞IO、非阻塞IO、多路复用、信号驱动IO、异步IO”&#…

阅读更多 →
半导体良率分析平台的多源数据集成实战:从SECS/GEM到EAP 2026/9/30 11:00:25

半导体良率分析平台的多源数据集成实战:从SECS/GEM到EAP

从事半导体制造或者封测这一行的朋友,应该都对“良率”这俩字又爱又恨。它直接跟钱挂钩,跟产能挂钩,跟客户信任挂钩。但真要把良率分析做好,尤其是当产品进入量产爬坡或者遇到异常波动时,你手里得有足够“干净”且“全…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉