第10天--算法(省份数量(并查集),岛屿数量)
省份数量
class Solution {
public int findCircleNum(int[][] isConnected) {
int N = isConnected.length;
Unionfind unionfind = new Unionfind(N);
for(int i = 0;i < N;i ++) {
for(int j = i + 1;j < N;j ++) {
if(isConnected[i][j] == 1) {
unionfind.union(i,j);
}
}
}
return unionfind.sets;
}
}
class Unionfind {
int parent[];
int size[];
int help[];
int sets;
public Unionfind(int N) {
parent = new int[N];
size = new int[N];
help = new int[N];
sets = N;
for(int i = 0;i < N;i ++) {
parent[i] = i;
size[i] = 1;
}
}
public int find(int i) {
int j = 0;
while(i != parent[i]) {
help[j ++] = i;
i = parent[i];
}
j --;
for(;j >=0;j --) {
parent[help[j]] = i;
}
return i;
}
public void union(int i,int j) {
int x = find(i);
int y = find(j);
if(x != y) {
if(size[x] >= size[y]) {
size[x] += size[y];
parent[y] = x;
}else {
size[y] += size[x];
parent[x] = y;
}
sets --;
}
}
}
岛屿数量
class Solution {
public int numIslands(char[][] grid) {
if(grid == null) {
return 0;
}
int res = 0;
for(int i = 0;i < grid.length;i ++) {
for(int j = 0;j < grid[0].length;j ++) {
if(grid[i][j] == '1') {
process(grid,i,j);
res ++;
}
}
}
return res;
}
public void process(char[][] grid,int x,int y) {
if(x < 0 || y < 0 || x == grid.length || y == grid[0].length || grid[x][y] != '1') {
return;
}
grid[x][y] = '2';
process(grid,x + 1,y);
process(grid,x - 1,y);
process(grid,x,y + 1);
process(grid,x,y - 1);
}
}

浙公网安备 33010602011771号