目录
题目
题目:计算岛屿的个数(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();