LeetCode: Surrounded Regions [130]
生活随笔
收集整理的這篇文章主要介紹了
LeetCode: Surrounded Regions [130]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目】
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,
After running your function, the board should be:
X X X X X X X X X X X X X O X X
【題意】
給定一個二維矩陣,由'X'和'O'填充,本題要求把那些被'X'包圍的'O'替換為'X'。注意這里的包圍是指四周全然包圍。假設某片'O'區域觸及了矩陣的邊界。則這片區域就不算被'X'包圍。
【思路】
? ? 我們僅僅須要先把觸及到邊界的'O'區域所有替換成還有一個字母, 比方'M'。矩陣中剩下的'O'區域就肯定是被包圍的了。
? ? 然后,我們掃描矩陣把'O'替換成'X', 把'M'替換回'O'就可以
? ??
? ? 區域的遍歷,使用DFS或BFS
? ? DFS要使用遞歸,當矩陣非常大的時候easy超時
? ? 所以本題使用BFS
【代碼】
class Solution { public:void O2M(vector<vector<char> >&board, int i, int j){//從board[i][j]開始。遍歷'O'區域,把'O'替換成'M'int rows=board.size();int cols=board[0].size();queue<int> qe;qe.push(i*cols+j);board[i][j]='M';while(!qe.empty()){int pos = qe.front(); qe.pop();i=pos/cols;j=pos%cols;//推斷上方if(i-1>=0 && board[i-1][j]=='O'){board[i-1][j]='M'; //注意在將相鄰元素填到隊列中時,須要將它標記為以訪問,否則以后在確定其它節點的'O'相鄰位置時,非常有可能又把這個節點增加到隊列中。造成死循環。qe.push((i-1)*cols + j);}//推斷下方if(i+1<rows && board[i+1][j]=='O'){board[i+1][j]='M';qe.push((i+1)*cols + j);}//推斷左方if(j-1>=0 && board[i][j-1]=='O'){board[i][j-1]='M';qe.push(i*cols + j-1);}//推斷右方if(j+1<cols && board[i][j+1]=='O'){board[i][j+1]='M';qe.push(i*cols + j+1);}}}void solve(vector<vector<char>> &board) {int rows=board.size();if(rows==0)return;int cols=board[0].size();if(cols==0)return;//把臨邊的'O'區域替換成'M'//上邊for(int j=0; j<cols; j++){if(board[0][j]=='O')O2M(board, 0, j);}//下邊for(int j=0; j<cols; j++){if(board[rows-1][j]=='O')O2M(board, rows-1, j);}//左邊for(int i=0; i<rows; i++){if(board[i][0]=='O')O2M(board, i, 0);}//右邊for(int i=0; i<rows; i++){if(board[i][cols-1]=='O')O2M(board, i, cols-1);}//掃描矩陣。把O替換成X, 把M替換成Ofor(int i=0; i<rows; i++){for(int j=0; j<cols; j++){if(board[i][j]=='O')board[i][j]='X';else if(board[i][j]=='M')board[i][j]='O';}}} };總結
以上是生活随笔為你收集整理的LeetCode: Surrounded Regions [130]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VNC CentOS
- 下一篇: mongodb部署以及数据操作