[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
原创粉丝点击