Shu-How Zの小窝

Loading...

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 







9

posted @ 2025-02-22 15:39  KooTeam  阅读(8)  评论(0)    收藏  举报