130. Surrounded Regions
来源:互联网 发布:vscode github 编辑:程序博客网 时间:2024/05/17 22:08
这道题只要把与边缘相连的‘O’全部换成‘V’,然后将所有的除‘V’之外的字母全部换成‘X’,最后再讲所有的‘V’换成‘O’。 方法的就是将DFS与边缘相连的‘O’, 或者BFS与边缘相连的‘O’。但是递归版本的DFS栈溢出,所有用栈的DFS即可。
1. 超时版本
class Solution {public:void solve(vector<vector<char>>& board) { if(board.empty() || board[0].empty()) return; int n = board.size(), m = board[0].size(); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(i == 0 || i == n-1 || j == 0 || j == m-1) dfs(board, i, j); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = (board[i][j] == 'V') ? 'O' : 'X';}void dfs(vector<vector<char>> &board, int row, int col){ int n = board.size(), m = board[0].size(); if(row < 0 || row >= n || col < 0 || col >= m) return; if(board[row][col] != 'O') return; board[row][col] = 'V'; dfs(board, row+1, col); dfs(board, row-1, col); dfs(board, row, col+1); dfs(board, row, col-1); }};
- 改进版本 用栈
class Solution { public: typedef vector<vector<char> > BOARDTYPE; void solve(BOARDTYPE &board) { if (board.empty() || board[0].empty()) return; int N = board.size(), M = board[0].size(); for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) if (i == 0 || j == 0 || i == N-1 || j == M-1) dfs(board, i, j); // you may call dfs or bfs here! for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) board[i][j] = (board[i][j] == 'V') ? 'O' : 'X'; } void dfs(vector<vector<char>> &board, int row, int col) { int n = board.size(), m = board[0].size(); if(row < 0 || row >= n || col < 0 || col >= m) return; if(board[row][col] != 'O') return; stack<pair<int, int>> s; s.push(make_pair(row, col)); while(!s.empty()) { row = s.top().first; col = s.top().second; s.pop(); board[row][col] = 'V'; if(row+1 < n && board[row+1][col] == 'O') s.push(make_pair(row+1, col)); if(row-1 >= 0 && board[row-1][col] == 'O') s.push(make_pair(row-1, col)); if(col+1 < m && board[row][col+1] == 'O') s.push(make_pair(row, col+1)); if(col-1 >= 0 && board[row][col-1] == 'O') s.push(make_pair(row, col-1)); } } };
- BFS方法
class Solution { public: typedef vector<vector<char> > BOARDTYPE; void solve(BOARDTYPE &board) { if (board.empty() || board[0].empty()) return; int N = board.size(), M = board[0].size(); queue<pair<int,int>> q; for (int i = 0; i < N; ++i){ if(board[i][M-1]=='O' ){ q.push(make_pair(i,M-1)); board[i][M-1]='V'; } if(board[i][0]=='O'){ q.push(make_pair(i,0)); board[i][0]='V'; } } for (int j = 0; j < M; ++j){ if(board[0][j]=='O'){ q.push(make_pair(0,j)); board[0][j]='V'; } if( board[N-1][j]=='O'){ q.push(make_pair(N-1,j)); board[N-1][j]='V'; } } bfs(board,q); for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) board[i][j] = (board[i][j] == 'V') ? 'O' : 'X'; } void bfs(BOARDTYPE &board, queue<pair<int,int>> &q) { int N = board.size(), M = board[0].size(); while(!q.empty()){ int row = q.front().first; int col = q.front().second; q.pop(); if(row+1<N && board[row+1][col]=='O'){ q.push(make_pair(row+1,col)); board[row+1][col]='V'; } if(row-1>=0 && board[row-1][col]=='O'){ q.push(make_pair(row-1,col)); board[row-1][col]='V'; } if(col+1<M && board[row][col+1]=='O'){ q.push(make_pair(row,col+1)); board[row][col+1]='V'; } if(col-1<N && board[row][col-1]=='O'){ q.push(make_pair(row,col-1)); board[row][col-1]='V'; } }//end while } };
0 0
- [LeetCode]130.Surrounded Regions
- LeetCode 130. Surrounded Regions
- [leetcode] 130.Surrounded Regions
- 130. Surrounded Regions
- Leetcode 130. Surrounded Regions
- 130. Surrounded Regions
- 130. Surrounded Regions
- leetcode 130. Surrounded Regions
- leetcode 130. Surrounded Regions
- LeetCode 130. Surrounded Regions
- 130. Surrounded Regions
- [LeetCode]130. Surrounded Regions
- LeetCode 130. Surrounded Regions
- 130. Surrounded Regions
- LeetCode *** 130. Surrounded Regions
- 130. Surrounded Regions
- Leetcode 130. Surrounded Regions
- [leetcode] 130. Surrounded Regions
- [Web前端技术教学]网页布局-基础布局练习-带框的界面铺满整个浏览器
- 基于visual c++之windows核心编程代码分析(13)获取磁盘可用空间信息
- 翻译《有关编程、重构及其他的终极问题?》——8.记住:析构函数中的异常是危险的
- Atitit 查询优化器的流程attilax总结
- StudentManager-java+mysql学生管理系统
- 130. Surrounded Regions
- 博客开通
- 配置ssh无密码访问
- 基于visual c++之windows核心编程代码分析(8)自动下载更新程序
- C#调用C++的dll两种方法(托管与非托管)
- 自己实现简单RPC功能
- 设置label的约束时遇到的小问题
- spring学习笔记(22)----基于配置文件的方式来配置AOP
- CSS-4的学习