Union find
union find很适合那种那几个应该在同一队里已经告诉你的题,如果说像group anagram这种哪些要group在一起还要你自己去找的就不太合适
int find(int[] leader, int idx) {
// find finds idx's root leader, it also updates its leader when finding it
if (leader[idx] == idx) {
return idx;
}
leader[idx] = find(leader, leader[idx]);
}int union(int[]size, int[]leader, int a, int b) {
// union unites two groups
int leadera = find(leader, a);
int leaderb = find(leader, b);
if (leadera == leaderb) {
return 0;
}
if (size[leadera] >= size[leaderb]) {
leader[leaderb] = leadera;
//只要leader对应的size时正确的就好了,非leader的size其实没意义,下同
size[leadera] += size[leaderb];
} else {
leader[leadera] = leaderb;
size[leaderb] += size[leadera];
}
return 1;
}也可以不union by size,但是始终注意union时是update root的leader
在已经union好了之后,可以通过遍历index找他们对应的leader的方式遍历union里所有group的leader/root
Last updated