Union-Find算法小结
对Union Find算法不熟悉,可参看
http://blog.csdn.net/dm_vincent/article/details/7655764
http://blog.csdn.net/dm_vincent/article/details/7769159
个人觉得该博文阐述非常通俗易懂,第二个链接是博主举的几个应用例子。
几个需要思考的问题:
这种算法通常应用于什么场景?怎么用?
如何将问题归约到union-find或者说union的目的是什么?
怎么union,即两个元素满足什么条件时可以union?
>>两个元素有关联
题目 |
union 什么 |
union目的 |
Graph Valid Tree |
一条边的两个顶点 |
若union两个顶点时发现根一样,说明已经在同一棵树中,说明输入graph存在环,非tree;union结束后,计数有多少个不同的根,当且仅当存在一个根时事vaild tree |
Subtree Sum |
节点同其父节点 |
将以指定id节点为根的所有节点union在一起,对这个union中的元素值求和 |
Number of Islands |
两个相邻的1元素 |
union后计数union集合数量(通过计数union数组中根节点数量) |
Surrounded Regions |
所有从边界可达的O元素union在一起 |
union完成后那些没有在边界可达O集合中的O是需要翻转的 |
https://leetcode.com/problems/surrounded-regions/
此题debug了很久,一个20*20的case 总是通不过,原因是oRoot的rank值设置得不够大,
会被矩阵中的其他元素超过从而oRoot不再是oRoot导致整个矩阵的O将全部被改为X。