暑假算法7.27,Day26
并查集
第一题
class Solution {
int[] parent;
int count;
public int find(int p) {
while (p != parent[p]) {
parent[p] = parent[parent[p]];
p = parent[p];
}
return p;
}
public void union(int p, int q) {
int rootP = find(p);
int rootQ = find(q);
if (rootP == rootQ)
return;
parent[rootP] = rootQ;
count--;
}
public int findCircleNum(int[][] isConnected) {
int N = isConnected.length;
// 连通分量个数
count = N;
// 连接关系
parent = new int[N];
count = N;
for (int i = 0; i < N; i++) {
parent[i] = i;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (isConnected[i][j] == 1)
union(i, j);
}
}
return count;
}
}
第二题
class Solution {
#define maxn 250005
int fa[maxn];
int row,col;
int dir[2][2]={{0,1},{1,0}};
void init(){
for(int i=0;i<maxn;++i){
fa[i]=i;
}
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int union_( int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
fa[fx]=fy;
return 1;
}
return 0;//返回0代表二者已经在一个集合中,1代表将二者union到一起了
}
public:
bool containsCycle(vector<vector<char>>& grid) {
init();
row=grid.size();
col=grid[0].size();
for(int i=0;i<row;++i){
for(int j=0;j<col;++j){
for(int k=0;k<2;++k){
int ti=i+dir[k][0];
int tj=j+dir[k][1];
if(ti==row||tj==col){
continue;
}
int a=i*col+j;
int b=ti*col+tj;
if(grid[i][j]==grid[ti][tj]){
if(!union_(a,b)){
return true;
}
}
}
}
}
return false;
}
};
第三题
class Solution {
public:
int find(vector<int>& father, int u) {
return father[u] == u ? u : (father[u] = find(father, father[u]));
}
void merge(vector<int>& father, int u, int v) {
int x = find(father, u), y = find(father, v);
if(x == y) return;
father[x] = y;
}
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
vector<int> father(edges.size() + 1);
for(int i = 0; i <= edges.size(); i++) {
father[i] = i;
}
int num = 0;
for(int i = 0; i < edges.size(); i++) {
if(find(father, edges[i][0]) != find(father, edges[i][1])) {
merge(father, edges[i][0], edges[i][1]);
}
else {
return edges[i];
}
}
return vector<int>{};
}
};