leetcode130.被圍繞的區域
阿新 • • 發佈:2018-12-22
題目:
給定一個二維的矩陣,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
圍繞的區域,並將這些區域裡所有的 'O'
用 'X'
填充。
示例:
X X X X
X O O X
X X O X
X O X X
執行你的函式後,矩陣變為:
X X X X
X X X X
X X X X
X O X X
解釋:
被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的 'O'
都不會被填充為 'X'
。 任何不在邊界上,或不與邊界上的 'O'
'O'
最終都會被填充為 'X'
。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
1.先將用兩重迴圈將二維陣列逐個判斷,結果
#include <iostream> #include <vector> using namespace std; class Solution { public: void solve(vector<vector<char> >& board) { if(board.size()==0)return; for(int i=1;i<board.size()-1;i++){ for(int j=1;j<board[0].size()-1;j++){ if(board[i][j]=='O') if(dfs(board,i,j))//如果O是被包圍的部分 Dfs(board,i,j);//將該區域全部置為‘X’ } } } void Dfs(vector<vector<char> >& board,int i,int j){ if(board[i][j]=='O'){ board[i][j]='X'; dfs(board,i+1,j); dfs(board,i,j+1); dfs(board,i-1,j); dfs(board,i,j-1); } } bool dfs(vector<vector<char> >& board,int i,int j){//判斷是否為被包圍的O int x=board.size(); int y=board[0].size(); if(board[i][j]=='X')return true; if(i==0||j==0||i==x-1||j==y-1) return false; board[i][j]='X'; bool result= dfs(board,i+1,j)&& dfs(board,i,j+1)&& dfs(board,i-1,j)&& dfs(board,i,j-1); board[i][j]='O'; return result; } }; int main() { vector<vector<char> > board(4,vector<char>(4,'X')); board[1][1]='O'; board[1][2]='O'; board[2][2]='O'; board[3][1]='O'; Solution a; a.solve(board); for(int i=0;i<board.size();i++){ for(int j=0;j<board[0].size();j++) cout<<board[i][j]<<" "; cout<<endl; } return 0; }
發現,若不被包圍的區域過大時,我需要重複的從每一個O開始DFS,耗費時間頗多(N方次遍歷),從四周搜尋與邊緣相連的區域,做好標記(4N次遍歷),差一個數量級。
class Solution { public: void solve(vector<vector<char> >& board) { if(board.empty()||board.size()==1||board[0].size()==1)return; for(int i=0;i<board.size();i++) { if(board[i][0]=='O') dfs(board,i,0); if(board[i][board[0].size()-1]=='O') dfs(board,i,board[0].size()-1); } for(int i=0;i<board[0].size();i++) { if(board[0][i]=='O') dfs(board,0,i); if(board[board.size()-1][i]=='O') dfs(board,board.size()-1,i); } for(int i=0;i<board.size();i++){ for(int j=0;j<board[0].size();j++){ if(board[i][j]=='V') board[i][j]='O'; else if(board[i][j]=='O') board[i][j]='X'; } } } void dfs(vector<vector<char> >& board,int i,int j){ if(i<0||j<0||i>board.size()-1||j>board[0].size()-1) return ; if(board[i][j]!='O') return; board[i][j]='V'; dfs(board,i+1,j); dfs(board,i,j+1); dfs(board,i-1,j); dfs(board,i,j-1); } };