leetcode 200 岛屿数量
题目链接:https://leetcode-cn.com/problems/number-of-islands/
思路:其实就相当于找这个图的连通分量数目,可以dfs,bfs和并查集,下面给出并查集的解法。
有个小技巧:只需要向右和向下两个方向合并就好了,因为左和上两个方向属于重复边。
下次再做这题随机补上dfs/bfs的方法8
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int n = grid.size(), m = grid[0].size();
int sum = n * m;
init(sum);
int tmpx, tmpy, index, indextmp;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
index = i * m + j;
if(grid[i][j] == '0'){
p[index] = -1;
continue;
}
for(auto &ne : next){
tmpx = i + ne[0];
tmpy = j + ne[1];
if(tmpx<0 || tmpy <0 || tmpx >= n || tmpy >= m){
continue;
}
if(grid[tmpx][tmpy] == '0') continue;
indextmp = tmpx * m + tmpy;
//printf("%d %d (%d) & %d %d (%d)\n",i,j,grid[i][j],tmpx,tmpy,grid[tmpx][tmpy]);
merge(index, indextmp);
}
}
}
m = 0;
for(int i = 0; i < sum; i++){
if(p[i] == i) m++;
}
return m;
}
private:
int p[302*302];
vector<vector<int>> next = {
{0,1},
{1,0}
};
void init(int n){
for(int i = 0; i < n; i++){
p[i] = i;
}
}
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge(int n, int m){
p[find(n)] = find(m);
}
};