LeetCode 130 與 並查集

2021-09-29 05:26:42 字數 2038 閱讀 6109

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解釋 被圍繞的區間不會存在於...