leetcode-130
solution1:
遍歷邊界點, 如果該值為 『o』, 則在該處進行遞迴繼續擴充套件. 並將走過的路程上的點賦值為 『*』.
遍歷整個二維空間, 將所有為 『*』 的賦值為 『o』, 其他均為 『x』.
code:
class
solution
if(board[n-1]
[j]==
'o')
}for
(int i =
1; i < n-
1; i++)if
(board[i]
[m-1]==
'o')
}for
(int i =
0; i < n; i++)}
}void
solveit
(int i,
int j, vectorchar
>
>
& board)
if(i < board.
size()
-1&& board[i+1]
[j]==
'o')
if(j >
0&& board[i]
[j-1]==
'o')
if(j < board[0]
.size()
-1&& board[i]
[j+1]==
'o')}}
;
solution2:
使用並查集, 順便了解了並查集的概念及其實現.
將邊界為 『o』 的點, 均"連線"到乙個額外的虛擬點. 對於每個為 『o』 的內部點, 判斷其周圍是否為 『o』, 若是, 則將這兩個結點所在的子樹"連線"到一起.
"連線"即指並查集中的 union 操作. 歸併兩個子樹.
code1:
並查集的實現:
class
ufreturn p;
}public:uf
(int n)
count = n;}~
uf()void
uni(
int p,
int q)
else
if(rank[p]
< rank[q]
)else
count--
;// 樹的數量 -1
}void
unichild
(int p,
int q)
} bool diff
(int p,
int q)
intgetcount()
};
應用到 leetcode 中:
class
solution
else
if(board[i+1]
[j]==
'o')
if(board[i]
[j-1]==
'o')
if(board[i]
[j+1]==
'o')}}
}}for(
int i =
0; i < n; i++)}
}}};
關於並查集
成員變數:
int *parent: 指向每個結點的父結點.初始化的並查集每個結點都是乙個子樹, 每個結點的 parent 均為其本身.
int *rank: 每個結點優先順序. 用於歸併兩個子樹時, 指定哪個作為父結點, 哪個作為子節點. 上面**的實現中, 以樹的深度作為優先順序.
int count: 整個並查集中的樹的數量. 初始每個結點均為子樹, count = n;
solution2 參考: a really ****** and readable c++ solution\uff0conly cost 12ms
LeetCode130 被圍繞的區域
給定乙個二維的矩陣,包含 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解釋 被圍繞的區間不會存在於...
Leetcode130 被圍繞的區域
給定乙個二維的矩陣,包含 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解釋 被圍繞的區間不會存在於...
leetcode 130被圍繞的區域
給定乙個二維的矩陣,包含 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解釋 被圍繞的區間不會存在於...