200.岛屿数量
先搜索一下二维数组,如果一个位置是1.这是要判断,当前节点上下左右的位置是否为1,是的话开始合并;最后出来的连通的分量就是要求的岛屿数量:
3g
// 定义并查集类
class UnionFind {
// 构造函数初始化并查集
constructor(n) {
this.parent = new Array(n).fill(0).map((item, index) => index);
this.rank = new Array(n).fill(1);
this.count = 0; // 初始化为0
}
// 查找元素的根节点
find(x) {
if (this.parent[x] !== x) {
this.parent[x] = this.find(this.parent[x]);
}
return this.parent[x];
}
// 合并两个集合
union(x, y) {
let rootX = this.find(x);
let rootY = this.find(y);
if (rootX === rootY) {
return false;
}
if (this.rank[rootX] < this.rank[rootY]) {
this.parent[rootX] = rootY;
this.rank[rootY] += this.rank[rootX];
} else {
this.parent[rootY] = rootX;
this.rank[rootX] += this.rank[rootY];
}
this.count--;
}
// 判断两个元素是否属于同一个集合
connected(x, y) {
return this.find(x) === this.find(y);
}
// 获取集合的数量
getCount() {
return this.count;
}
}
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
if (grid.length === 0) return 0;
var m = grid.length, n = grid[0].length;
let uf = new UnionFind(m * n);
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] === '1') {
uf.count++; // 增加岛屿数量
// 向上合并
if (i - 1 >= 0 && grid[i - 1][j] === '1') {
uf.union(i * n + j, (i - 1) * n + j);
}
// 向下合并
if (i + 1 < m && grid[i + 1][j] === '1') {
uf.union(i * n + j, (i + 1) * n + j);
}
// 向左合并
if (j - 1 >= 0 && grid[i][j - 1] === '1') {
uf.union(i * n + j, i * n + j - 1);
}
// 向右合并
if (j + 1 < n && grid[i][j + 1] === '1') {
uf.union(i * n + j, i * n + j + 1);
}
}
}
}
return uf.count;
};
// 修正后的 grid
var grid = [["1", "0", "1", "1", "0", "1", "1"]];
console.log(numIslands(grid)); // 输出岛屿数量
// tips m n edge case y=kx+ax+b
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
if (grid.length === 0) return 0;
let visited=new Set();
let islandCount = 0;
var dfs=function(i,j){
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] === '0' || visited.has(`${i},${j}`)) {
return;
}
visited.add(`${i},${j}`);
dfs(i - 1, j);
dfs(i + 1, j);
dfs(i, j - 1);
dfs(i, j + 1);
}
for(let i=0;i<grid.length;i++){
for(let j=0;j<grid[i].length;j++){
if(grid[i][j]==='1'&&!visited.has(`${i},${j}`)){
dfs(i,j);
islandCount++;
}
}
}
return islandCount;
};
var grid = [["1", "0", "1", "1", "0", "1", "1"]];
console.log(numIslands(grid)); // 输出岛屿数量
// tips up down left right visiited dfs/bfs reverse edge case / black box /while box

浙公网安备 33010602011771号