[LeetCode] Surrounded Regions, Solution
来源:互联网 发布:电脑语音同声翻译软件 编辑:程序博客网 时间:2024/06/06 01:04
Given a 2D board containing
'X'
and 'O'
, capture all regions surrounded by 'X'
.A region is captured by flipping all
'O'
s into 'X'
s in that surrounded region .For example,
X X X XX O O XX X O XX O X X
After running your function, the board should be:
X X X XX X X XX X X XX O X X» Solve this problem
[解题思路]
刚拿到这个题,首先得想法就是BFS。对于每一个O,扫描其相邻节点,然后标示之,如果一个联通区域中有任何一个O在边界上,则保留之,否则清除该联通域。实现代码如下:
1: vector<int> xIndex; 2: vector<int> yIndex; 3: map<int, int> visited; 4: void solve(vector<vector<char>> &board) { 5: int row = board.size(); 6: if(row == 0) return; 7: int col = board[0].size(); 8: for(int i =0; i < row; i++) 9: { 10: for(int j =0; j< col; j++) 11: { 12: if(board[i][j] == 'X' || IsVisited(i*row+j)) continue; 13: visited.clear(); 14: bool surranded = true; 15: xIndex.clear(); 16: xIndex.push_back(i); 17: yIndex.clear(); 18: yIndex.push_back(j); 19: int k =0; 20: while(k<xIndex.size()) 21: { 22: int x = xIndex[k]; 23: int y = yIndex[k]; 24: visited[x*row +y] =1; 25: if(IsInBoundary(x, y, row, col)) surranded = false; 26: if(x<row-1 && board[x+1][y] == 'O' && !IsVisited((x+1)*row+y)) {xIndex.push_back(x+1); yIndex.push_back(y);} 27: if(y<col-1 && board[x][y+1] == 'O' && !IsVisited(x*row+y+1)) {xIndex.push_back(x); yIndex.push_back(y+1);} 28: k++; 29: } 30: if(surranded) //clean the surranded mask 31: { 32: for(int m = 0; m<xIndex.size(); m++) 33: { 34: board[xIndex[m]][yIndex[m]] = 'X'; 35: } 36: } 37: } 38: } 39: } 40: bool IsInBoundary(int x, int y, int row, int col) 41: { 42: if(x ==0 || x == row-1) return true; 43: if(y ==0 || y == col-1) return true; 44: return false; 45: } 46: bool IsVisited(int index) 47: { 48: if(visited.find(index) == visited.end()) return false; 49: return true; 50: }
小数据可以过,但是大数据提示Memory Limit Exceeded,代码中唯一用到的就是visited这个map,所以,系统期望的方法应该是不需要辅助空间的。转换一下思路,真的需要开辟一个map在存储访问信息吗?其实这个可以省掉的,既然已经知道连通区域必须至少一个元素是在四边,那么一开始直接从四边开始扫描就好了,所以无法connect到得元素都是应该被清除的。所以,算法如下:
1. 从四条边上的O元素开始BFS,所有相连的O都赋个新值,比如‘Y’
2. 扫描整个数组,所有现存的O元素全部置为X,所有Y元素置为O
打完收工。代码实现如下:
1: vector<int> xIndex; 2: vector<int> yIndex; 3: void solve(vector<vector<char>> &board) { 4: int row = board.size(); 5: if(row == 0) return; 6: int col = board[0].size(); 7: xIndex.clear(); 8: yIndex.clear(); 9: for(int i =0; i< row; i++) 10: { 11: if(board[i][0] == 'O') 12: { 13: xIndex.push_back(i); 14: yIndex.push_back(0); 15: } 16: if(board[i][col-1] == 'O') 17: { 18: xIndex.push_back(i); 19: yIndex.push_back(col-1); 20: } 21: } 22: for(int i =0; i< col; i++) 23: { 24: if(board[0][i] == 'O') 25: { 26: xIndex.push_back(0); 27: yIndex.push_back(i); 28: } 29: if(board[row-1][i] == 'O') 30: { 31: xIndex.push_back(row-1); 32: yIndex.push_back(i); 33: } 34: } 35: int k =0; 36: while(k<xIndex.size()) 37: { 38: int x = xIndex[k]; 39: int y = yIndex[k]; 40: board[x][y] = 'Y'; 41: if(x>0 && board[x-1][y] == 'O' ) {xIndex.push_back(x-1); yIndex.push_back(y);} 42: if(x<row-1 && board[x+1][y] == 'O' ) {xIndex.push_back(x+1); yIndex.push_back(y);} 43: if(y>0 && board[x][y-1] == 'O' ) {xIndex.push_back(x); yIndex.push_back(y-1);} 44: if(y<col-1 && board[x][y+1] == 'O' ) {xIndex.push_back(x); yIndex.push_back(y+1);} 45: k++; 46: } 47: for(int i =0; i< row; i++) 48: { 49: for(int j =0; j< col; j++) 50: { 51: if(board[i][j] =='O') board[i][j] = 'X'; 52: if(board[i][j] == 'Y') board[i][j] = 'O'; 53: } 54: } 55: }
0 0
- [LeetCode] Surrounded Regions, Solution
- [LeetCode] Surrounded Regions, Solution
- Surrounded Regions LeetCode :My Solution
- LeetCode : Surrounded Regions
- [leetcode] Surrounded Regions
- leetcode 128: Surrounded Regions
- LeetCode 39: Surrounded Regions
- 【leetcode】Surrounded Regions
- LeetCode - Surrounded Regions
- LeetCode之Surrounded Regions
- leetcode:Surrounded Regions
- [LeetCode]Surrounded Regions
- LeetCode - Surrounded Regions
- [Leetcode]Surrounded Regions
- Leetcode Surrounded Regions
- [leetcode]Surrounded Regions
- leetcode Surrounded Regions
- Leetcode: Surrounded Regions
- 数据库篇之存储过程[bsp_getorderbyosn]和[bsp_getorderbyoid](非官方版本)
- 数据库篇之存储过程[bsp_getfavoriteproductlist](非官方版本)
- 数据库篇之存储过程[bsp_createorder](非官方版本)
- 数据库篇之最后几个数据表的更新
- AsyncTask 并行任务使用、测试
- [LeetCode] Surrounded Regions, Solution
- Leetcode NO.60 Permutation Sequence
- 排序算法(一)- 冒泡排序
- 排序算法(二)- 快速排序
- 安装 CentOS 7 后必做的七件事
- Step by Step Ubuntu下GPU测试Theano
- Leetcode NO.50 Pow(x, n)
- 使用nat123来用外网访问内网SVN-https443映射方法
- asp.net,jsp,php,安卓Android,ios计算机毕业课程设计源码免费打包下载