JavaScript : leetcode题号 433计算岛屿的个数(Number of Islands)-有完整代码

目录

题目

实现方法1: DFS深度优先

实现方法2: BFS广度搜索


题目

题目:计算岛屿的个数(Number of Islands)
描述:给一个 01 矩阵,求不同的岛屿的个数。0 代表海,1 代表岛,如果两个 1 相邻,那么这两个 1 属于同一个岛。我们只考虑上下左右为相邻。

示例 1:

    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 1, 1]

输出:3

示例2:

    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0]

输出:1

实现方法1: DFS深度优先

leetcode题号——433,难度——easy

思路

  通过遍历找到岛屿的边缘,然后用DFS深度优先搜索可以找到整个岛屿并将岛屿转变为海洋(同化方法防止重复计算),岛屿计数+1,继续向后搜索岛屿直到整个区域搜索完成。

Javascript实现:

//垂直或者水平方向,只有1的独立块有同个。(被0包括的1为一个块)
let grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 1, 1]
] // islands =3

grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 1, 1]
] // islands =2
grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0]
] // islands =1

grid = [
    [1, 0, 1, 0, 1]
    // [0, 0, 1, 0, 0],
    // [0, 0, 0, 0, 0]
] // islands =3
let ilandCount = 0;
let row = grid.length
let col = grid[0].length

//DFS深度遍历,遍历过的1同化为0,然后递归方式遍历4个方向
function dfs(grid, i, j, row, col) {
    console.log(i,j)
    if (i >= row || i < 0 || j < 0 || j >= col || grid[i][j] === 0) {
        console.log('false')
        return false
    }
    console.log(`(${i},${j}),${grid[i][j]}`)
    grid[i][j] = 0;
    dfs(grid, i - 1, j, row, col)
    dfs(grid, i + 1, j, row, col)
    dfs(grid, i, j + 1, row, col)
    dfs(grid, i, j - 1, row, col)
}

function main() {
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[i].length; j++) {
            if (grid[i][j] === 1) {
                dfs(grid, i, j, row, col)
                ilandCount++;
            }
        }
    }
    console.log(grid)
    console.log(ilandCount)
}

main();
 

实现方法2: BFS广度搜索

        bfs()上下左右搜索方法,这里我用了嵌套,也可以用while循环来处理。

class Queue {
    /*本类实现功能:
    * 队列:特点: 先进先出
    * 添加:在尾部添加:push
    * 删除:删除第一个元素:shift
    * */
    queue;//[]

    constructor(queue = []) {
        this.queue = queue;
    }

    //入队:在尾添加:push?
    enqueue(value) {
        if (value !== null) {
            this.queue.push(value);
        }
    }

    // 出队:删除第一个元素
    dequeue() {
        return this.queue.shift();

    }

    //返回队列的第一个元素:队头
    front() {
        return this.queue[0]
    }

    //判断队列是否空
    isEmpty() {
        return this.queue.length === 0
    }

    //检查队列长度
    length() {
        return this.queue.length;
    }

}


let grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 1, 1]
] // islands =3

/*grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 1, 1]
] // islands =2*/
/*grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0]
] // islands =1*/

/*

grid = [
    [0, 0, 0, 0, 0],
    [1, 0, 1, 0, 0],
    [0, 0, 1, 1, 0],
    [0, 0, 0, 0, 0]
] // islands =1
*/

function bfs(grid, q) {
    if (!q.isEmpty()) {
        let i = q.front()[0]
        let j = q.front()[1]

        if (i - 1 > 0 && grid[i - 1][j] === 1) {//当前元素上一个
            grid[i - 1][j] = 0
            q.enqueue([i - 1, j])
        }
        if (i + 1 < row && grid[i + 1][j] === 1) {//当前元素下一个
            grid[i + 1][j] = 0
            q.enqueue([i + 1, j])
        }

        if (j - 1 < 0 && grid[i][j - 1] === 1) {//当前元素左一个
            grid[i][j - 1] = 0
            q.enqueue([i, j - 1])
        }
        if (j + 1 < col && grid[i][j + 1] === 1) {//当前元素右一个
            grid[i][j + 1] = 0
            q.enqueue([i, j + 1])
        }
        console.log(q.dequeue())
        if (!q.isEmpty()) bfs(grid, q)
    }
}

let ilandCount = 0;
let row
let col

function main() {
    row = grid.length
    col = grid[0].length
    let q = new Queue()
    console.log(grid)
    for (let i = 0; i < row; i++) {//行
        for (let j = 0; j < col; j++) {//列
            if (grid[i][j] !== undefined && grid[i][j] === 1) {
                console.log("找到岛屿了", grid)
                ilandCount++
                grid[i][j] = 0
                q.enqueue([i, j]) //保存当前元素对应x,y到队列
                //上下左右找1,判断岛屿的大小
                bfs(grid, q)
                console.log(q)
            }

        }
    }
    console.log(">>当前岛屿数是:", ilandCount)
}

main();

猜你喜欢

转载自blog.csdn.net/LlanyW/article/details/129365508