今天做这道题遇到一个栈溢出的报错,一脸懵逼。
代码如下
var maxAreaOfIsland = function(grid) {
let len=grid.length
let wid=grid[0].length
let dfs=function(i,j){
if (i-1>=0 && grid[i-1][j]===1) {
res++
dfs(i-1,j)
}
if (i+1<len && grid[i+1][j]===1) {
res++
dfs(i+1,j)
}
if (j-1>=0 && grid[i][j-1]===1) {
res++
dfs(i,j-1)
}
if (j+1<wid && grid[i][j+1]===1) {
res++
dfs(i,j+1)
}
}
let max=0
let res
for (let i = 0; i <len; i++) {
for (let j = 0; j < wid; j++) {
if (grid[i][j]===1) {
res=1
dfs(i,j)
if (max<res) {
max=res
}
}
}
}
return max
};
console.log(maxAreaOfIsland([[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]));
本来我想的逻辑是判断某一网格的前后左右是否有1,如果有,res++,再判断他的前后左右,然后循环往复。这样写的错误在于dfs函数中,当i=1时可能会出现一种情况,调用dfs 然后遇到i-1,再调用dfs 再i+1,再dfs,再i-1。。。如此循环往复,便会出现栈溢出的情况。这种情况对应的实际含义就是相邻两块陆地(两个1)之间会出现重复调用的情况,形成一个闭环,出不来 。这种情况只需将计数过的陆地(1),做标记(在这里将计数过的置为-1)。
改过后的代码:
var maxAreaOfIsland = function(grid) {
let len=grid.length
let wid=grid[0].length
let dfs=function(i,j){
grid[i][j]=-1 //此处添加标记,将计数过的陆地置为-1
if (i-1>=0 && grid[i-1][j]===1) {
res++
dfs(i-1,j)
}
if (i+1<len && grid[i+1][j]===1) {
res++
dfs(i+1,j)
}
if (j-1>=0 && grid[i][j-1]===1) {
res++
dfs(i,j-1)
}
if (j+1<wid && grid[i][j+1]===1) {
res++
dfs(i,j+1)
}
}
let max=0
let res
for (let i = 0; i <len; i++) {
for (let j = 0; j < wid; j++) {
if (grid[i][j]===1) {
res=1
dfs(i,j)
if (max<res) {
max=res
}
}
}
}
return max
};