题目


Given a 2d grid map of ​​'1'​​​s (land) and ​​'0'​​s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

11110
11010
11000
00000

Answer: 1

Example 2:

11000
11000
00100
00011

Answer: 3

Credits:
Special thanks to ​@mithmatt for adding this problem and creating all test cases.

思路

这道题目搞了我很久,主要是一边解题一般玩了,这其实也是个典型的union-find题目,我们首先要将数组里面的两两之间的连通分量求出来,再利用我们​​前一篇博客​​的解法求连通数。

代码

class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.size()==0)
return 0;
int m = grid.size();
int n = grid[0].size();
int num1=0;
vector<int> tmp(2);
vector<vector<int>> res;
//第一次遍历矩阵将字符转换成整数
vector<vector<int>> matrixs;
for(int i=0;i<m;i++){
vector<int> matrix;
for(int j=0;j<n;j++)
{

matrix.push_back(grid[i][j]-48);
}
matrixs.push_back(matrix);
}
cout<<matrixs[0][1]<<endl;
//第二次遍历矩阵,统计有几个1,并赋值
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(matrixs[i][j]==1)
{
num1++;
matrixs[i][j] = num1;
}
}
//第三次遍历,寻找大小为2的连通分量,并存储到数组里
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(matrixs[i][j]==0)
continue;
else
{
tmp[1] = matrixs[i][j];
if(matrixs[i][max(j-1,0)]!=0)
{
tmp[0] =matrixs[i][max(j-1,0)];
res.push_back(tmp);
}
if(matrixs[max(i-1,0)][j]!=0)
{
tmp[0] =matrixs[max(i-1,0)][j];
res.push_back(tmp);
}
if(matrixs[i][max(j-1,0)]==0&&matrixs[max(i-1,0)][j]==0)
{
tmp[0] =matrixs[i][j];
res.push_back(tmp);
}


}
}

vector<int> M(num1+1);
for(int i=0;i<num1+1;i++)
M[i] = i;
for(auto item:res)
{
int p = item[0];
int q = item[1];
while(p!=M[p])
p = M[p];
while(q!=M[q])
q = M[q];
if(p!=q)
{
M[q] = p;
num1--;
}


}
return num1;
}
};