题意大概就是有多少块1是连在一起的(上下左右),例1:所有1都是连在一起的所以是一块岛屿;
例2:四个1、一个1、两个1三块,所以答案是3;
class Solution {
public:
vector<int> parent;
vector<int> rank; //记录树深度
int count;
void init(vector<vector<char>>& grid){
count=0;
int m=grid.size();
int n=grid[0].size();
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(grid[i][j]=='1'){
parent.push_back(i*n+j);
count++;
}
else{
parent.push_back(-1);
}
rank.push_back(0);//每棵树的深度为0;
}
}
}
int find(int i){
if (parent[i] != i) {
parent[i] = find(parent[i]);
}
return parent[i];
}
void unite(int x,int y){
int x_root=find(x);
int y_root=find(y);
if(x_root!=y_root){
if(rank[x_root]<rank[y_root]){//如果x的深度小就加在x结点下
swap(x_root,y_root);
}
parent[y_root]=x_root;
if(rank[x_root==y_root]) rank[x_root]+=1;
count--;
}
}
int numIslands(vector<vector<char>>& grid) {
int nr=grid.size();
if(!nr) return 0;
int nc=grid[0].size();
init(grid);//初始化parent数组
for(int i=0;i<nr;i++){
for(int j=0;j<nc;j++){
if(grid[i][j]=='1'){
grid[i][j]='0';
if(j+1<nc&&grid[i][j+1]=='1') unite(i*nc+j,i*nc+j+1);//向右找
if(i+1<nr&&grid[i+1][j]=='1') unite(i*nc+j,(i+1)*nc+j);//向下找
}
}
}
return count;
}
};