考察点:并查集;
出错点:
- 第一次出错在union上,重名了
- 第二次出错在在find函数中应该是i=UF【i】的,结果写反了,看来每一步代码都应该明确之后才能写出来。
C++ 代码:
class Solution {
public:
vector<int> UF;
vector<int> size;
int count;
int find(int i){
while (UF[i] != i)
i=UF[i];
return i;
};
void union1(int i, int j){
int ii=find(i);
int jj = find(j);
// cout<<"i="<<i<<";j="<<j<<" ii:"<<ii<<" jj"<<jj<<endl;
if (ii == jj)
return;
if (size[ii] <size[jj]) {
UF[ii] = jj;
//cout<<ii<<" "<<jj<<endl;
size[jj] += size[ii];
count--;
} else {
UF[jj] = ii;
//cout<<jj<<" "<<ii<<endl;
size[ii] += size[jj];
count--;
}
}
void init(int len) {
for (int i=0; i<len; i++) {
UF.push_back(i);
size.push_back(1);
}
count = len;
}
int findCircleNum(vector<vector<int>>& M) {
int len = M.size();
if (len == 0)
return 0;
init(len);
for (int i=0; i<len; i++) {
for (int j=i+1; j<len; j++) {
if (M[i][j] == 1) {
union1(i, j);
}
}
}
return count;
}
};