题目简述:这一题在200题的基础之上进行了升级,升级点在,在边界上的陆地,不算岛屿,算大陆,只能算四面邻水的陆地算岛屿。这一题的岛屿还有陆地与200题不同,0-岛屿,1-大海。
这一题的解题思路就跟200题一模一样了,没有丝毫的变动,只不过要对数据做下预处理,也就是处理那些大陆(非四面临水的陆地),也就是代码的15、20行
DFS
var closedIsland = function (grid) {
let res = 0
let row = grid.length, col = grid[0].length
var dfs = function (i, j) {
if (i < 0 || i >= row || j < 0 || j >= col) return
if (grid[i][j] === 1) return
grid[i][j] = 1 // 淹没
// 四个方向进行探索(淹没)
dfs(i - 1, j)
dfs(i + 1, j)
dfs(i, j - 1)
dfs(i, j + 1)
}
// 左右两边的陆地进行淹没
for (let i = 0; i < row; ++i) {
if (grid[i][0] === 0) dfs(i, 0)
if (grid[i][col - 1] === 0) dfs(i, col - 1)
}
// 上下两边的陆地进行淹没
for (let j = 0; j < col; ++j) {
if (grid[0][j] === 0) dfs(0, j)
if (grid[row - 1][j] === 0) dfs(row - 1, j)
}
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (grid[i][j] === 0) {
dfs(i, j)
res++
}
}
}
return res
};
BFS
淹没的操作一定不能忘
var closedIsland = function (grid) {
let res = 0
let row = grid.length, col = grid[0].length
let directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]
var bfs = function (i, j) {
grid[i][j] = 1 // 淹没
let queue = [[i, j]]
while (queue.length) {
let [x, y] = queue.shift()
// 4个方向上进行标记(淹没)
for (let [dx, dy] of directions) {
let fx = dx + x
let fy = dy + y
// 符合条件的进行标记
if (fx >= 0 && fx < row && fy >= 0 && fy < col && grid[fx][fy] === 0) {
queue.push([fx, fy])
grid[fx][fy] = 1 // 淹没
}
}
}
}
// 左右两边的陆地进行淹没
for (let i = 0; i < row; ++i) {
if (grid[i][0] === 0) bfs(i, 0)
if (grid[i][col - 1] === 0) bfs(i, col - 1)
}
// 上下两边的陆地进行淹没
for (let j = 0; j < col; ++j) {
if (grid[0][j] === 0) bfs(0, j)
if (grid[row - 1][j] === 0) bfs(row - 1, j)
}
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (grid[i][j] === 0) {
bfs(i, j)
res++
}
}
}
return res
};