给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1
示例 2:
输入: 11000 11000 00100 00011 输出: 3
并查集的问题,额,我也是开始学习,所以看了别人的
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
vector<int> UN;
//并查集 查找根节点
int find(int x){
if(x!=UN[x]) UN[x]=find(UN[x]);
return UN[x];
}
int numIslands(vector<vector<char>>& grid) {
int m=grid.size();
if(m==0) return 0;
int n=grid[0].size();
for(int i=0 ; i<m*n ; i++)
UN.push_back(i);
for(int i=0 ; i<m ; i++){
for(int j=0 ; j<n ; j++){
int x=i*n+j;
if(grid[i][j]=='0')
{
UN[x]=-1;
continue;
}
if(i!=0 && grid[i-1][j]=='1'){
int y=(i-1)*n+j;
UN[find(x)]=find(y);
}
if(j!=0 && grid[i][j-1]=='1'){
int y=i*n+j-1;
UN[find(x)]=find(y);
}
}
}
//查找具体连接块的数量
int res=0;
unordered_map<int ,int > mp;
for(int i=0 ; i<m*n ; i++){
if(UN[i]==-1) continue;
int y=find(i);
if(!mp[y]){ //查看当前节点的父节点是否一致,不一致就是不存在
res++;
mp[y]=1;
}
}
return res;
}
};