【问题标题】:Having problems solving Leetcode Question Max Area of Islands在解决 Leetcode 问题 Max Area of​​ Islands 时遇到问题
【发布时间】:2022-01-25 13:11:49
【问题描述】:

以下是我查找岛屿最大面积的代码,但由于某种原因,它一直未能通过此测试用例: [[1],[1]]

我不完全确定出了什么问题,并且我一直在考虑使用这种方法没有可能的解决方案。有人认为这段代码不能正常工作的一个可能原因是在底部的 for 循环中调用 dfs() 时 JS 的同步特性。

var maxAreaOfIsland = function(grid) {
        let maxArea = 0
    let currArea = 0

    let dirs = [
        [0,1],
        [1,0],
        [-1,0],
        [0,-1]
    ]

    function dfs(r,c){
        if(grid[r][c] === 0) return
        
        currArea++
        grid[r][c] = 0
        for(let [row,col] of dirs){
            let nr = r+row
            let nc = c+col
            if(nr<0 || nc< 0|| nr >= grid.length|| nc >= grid[0].length){
                return
            }
            dfs(nr,nc)
        }
    }

    for(let i = 0; i < grid.length; i++){
        for(let j = 0; j< grid[0].length; j++){
            if(grid[i][j] === 1){
                
                currArea = 0
                dfs(i,j)
                if(currArea > maxArea){
                    maxArea = currArea
                }
            }
        }
    }

    return maxArea
};

console.log(maxAreaOfIsland( [[1],[1]] ))

【问题讨论】:

    标签: javascript algorithm


    【解决方案1】:

    看起来dfs 函数意味着在非零位置周围搜索,在找到更多非零时增加currArea,并注意不要跑出矩阵的边缘。然而,边界检查中的return 在它应该只是continue 时放弃了搜索。一个更改,标有注释...

    var maxAreaOfIsland = function(grid) {
            let maxArea = 0
        let currArea = 0
    
        let dirs = [
            [0,1],
            [1,0],
            [-1,0],
            [0,-1]
        ]
    
        function dfs(r,c){
            if(grid[r][c] === 0) return
            
            currArea++
            grid[r][c] = 0
            for(let [row,col] of dirs){
                let nr = r+row
                let nc = c+col
                if(nr<0 || nc< 0|| nr >= grid.length|| nc >= grid[0].length){
                    continue;  // <-- notice, we keep searching
                }
                dfs(nr,nc)
            }
        }
    
        for(let i = 0; i < grid.length; i++){
            for(let j = 0; j< grid[0].length; j++){
                if(grid[i][j] === 1){
                    
                    currArea = 0
                    dfs(i,j)
                    if(currArea > maxArea){
                        maxArea = currArea
                    }
                }
            }
        }
    
        return maxArea
    };
    
    console.log(maxAreaOfIsland( [[1],[1]] ))

    【讨论】:

      【解决方案2】:

      试试这个:我想你需要在继续之前检查单元格在网格中是否有效。

      var maxAreaOfIsland = function(grid) {
              let maxArea = 0
          let currArea = 0
      
          let dirs = [
              [0,1],
              [1,0],
              [-1,0],
              [0,-1]
          ]
      
          function dfs(r,c){
              if(r<0 || c< 0|| r >= grid.length|| c >= grid[0].length)
                      return
              if(grid[r][c] === 0) return
              
              currArea++
              grid[r][c] = 0
              for(let [row,col] of dirs){
                  let nr = r+row
                  let nc = c+col
                  dfs(nr,nc)
              }
          }
      
          for(let i = 0; i < grid.length; i++){
              for(let j = 0; j< grid[0].length; j++){
                  if(grid[i][j] === 1){
                      
                      currArea = 0
                      dfs(i,j)
                      if(currArea > maxArea){
                          maxArea = currArea
                      }
                  }
              }
          }
      
          return maxArea
      };
      
      console.log(maxAreaOfIsland( [[1],[1]] ))
      

      我建议使用 C++,因为与 JS 相比,相同的代码将减少 8 倍

      【讨论】:

      • 嗨,谢谢,我正在使用 JS,我正在准备在一家臭名昭著的公司进行前端面试,至于为什么我需要能够在 JS 中解决这个问题,我不太确定,但我听说了进入这些大型科技公司必须做 leetcode
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2023-03-20
      • 2022-01-12
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多