200. Number of Islands
原创
©著作权归作者所有:来自51CTO博客作者小虎AI实验室的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目
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:
Answer: 1
Example 2:
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;
}
};