980. Unique Paths III [JavaScript]

本文深入探讨了在有限网格中寻找包含所有可移动格子的从起点到终点路径的算法。通过采用深度优先搜索(DFS)策略,文章详细介绍了如何遍历网格、记录关键坐标及移动选项,最终实现高效路径查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、解题思路

  题目要求求出从起点到终点的路径数,并且该路径包含所有可以移动的格子。

  也就是说,对于每一个格子的下一步移动有四个方向的选择,最容易想到的处理方法就是采用DFS搜索方法。

  在进行DFS之前,需要遍历整个网格,记录起点坐标以及可以移动的格子数量,从而决定搜索的深度。

  理论上其空间复杂度为O(4^mn),空间复杂度为O(mn),但是由于题目本身网格大小的限制,最终运行时间非常理想。

二、代码实现

const uniquePathsIII = grid => {

  let sx = -1
  let sy = -1
  let n = 1

  // 统计起始点坐标 可以移动的格子总数
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      const item = grid[i][j]
      if (item == 0) {
        n++
      } else if (item == 1) {
        sx = i
        sy = j
      }
    }
  }

  return dfs(grid, sx, sy, n)

  function dfs (grid, x, y, n) {
    // 边界情况处理
    if (x < 0 || x == grid.length || y < 0 || y == grid[0].length || grid[x][y] == -1) {
      return 0
    }
    if (grid[x][y] == 2 && n !== 0) {
      return 0
    }
    // 满足要求的情况
    if (grid[x][y] == 2 && n === 0) {
      return 1
    }
    // 记录已经访问过的格子
    grid[x][y] = -1
    const paths = dfs(grid, x + 1, y, n - 1) + dfs(grid, x, y + 1, n - 1) + dfs(grid, x - 1, y, n - 1) + dfs(grid, x, y - 1, n - 1)
    // 还原状态
    grid[x][y] = 0

    return paths
  }
}

  如果本文对您有帮助,欢迎关注微信公众号,为您推送更多大前端相关的内容, 欢迎留言讨论,ε=ε=ε=┏(゜ロ゜;)┛。

  您还可以在这些地方找到我:

<think>我们正在处理一个TypeError,提示Solution.uniquePaths方法缺少必要位置参数'n'。这个错误通常发生在调用类的方法时,没有提供足够的位置参数。假设我们有一个类Solution,其中定义了一个方法uniquePaths,这个方法需要两个位置参数(比如m和n),但在调用时只提供了一个(比如只提供了m,而缺少n)。例如:classSolution:defuniquePaths(self,m,n):#一些代码当我们这样调用时:Solution().uniquePaths(3)#这里只提供了一个参数3,但方法需要两个参数(除了self)就会导致错误:TypeError:uniquePaths()missing1requiredpositionalargument:'n'因此,我们需要确保在调用uniquePaths时传递两个整数参数(m和n)。例如:Solution().uniquePaths(3,7)#计算3行7列的网格但是,如果这个方法是静态方法或类方法,可能不需要self,但错误信息仍然会提示缺少参数。下面我们分步骤解释如何解决:步骤1:检查方法定义确保在类中定义uniquePaths方法时,参数包括self(如果是实例方法)、m和n。例如:defuniquePaths(self,m,n):步骤2:检查调用方式在调用时,必须传入两个参数(如果是实例方法,则通过实例调用,并传入m和n;如果是静态方法,则直接传入m和n)。步骤3:注意调用方法时使用的实例如果使用类名直接调用实例方法,则需要显式传递一个实例作为self,然后再传递m和n。通常我们不会这样做,而是创建实例:sol=Solution()sol.uniquePaths(m,n)或者直接:Solution().uniquePaths(m,n)步骤4:如果方法定义为静态方法如果在定义时使用了@staticmethod装饰器,那么就不需要self,但是调用时仍然需要传入两个参数:classSolution:@staticmethoddefuniquePaths(m,n):...调用:Solution.uniquePaths(m,n)#通过类名调用步骤5:如果方法定义为类方法使用@classmethod,第一个参数是cls,然后是两个参数:classSolution:@classmethoddefuniquePaths(cls,m,n):...调用:Solution.uniquePaths(m,n)#通过类名调用步骤6:处理默认参数如果方法的某些参数有默认值,则调用时可以省略。但如果没有默认值,则必须传递。因此,针对这个错误,解决方案是:在调用uniquePaths方法时,确保传递了两个整数参数(m和n)。示例代码:正确调用实例方法:sol=Solution()result=sol.uniquePaths(3,7)或者:result=Solution().uniquePaths(3,7)正确调用静态方法(假设方法被定义为静态):result=Solution.uniquePaths(3,7)注意:在静态方法和类方法的定义中,第一个参数不是self,因此在调用时不需要传递实例或类(对于静态方法)或者只需要传递类(对于类方法,但通常通过类名调用会自动传递类)。但要注意参数个数。如果问题仍然存在,请检查方法定义和调用的地方是否一致。下面是一个完整的例子(动态规划解决网格路径问题)供参考:```pythonclassSolution:defuniquePaths(self,m,n):#创建一个二维列表用于存储到达每个网格的路径数dp=[[1]*nfor_inrange(m)]#动态规划计算路径数foriinrange(1,m):forjinrange(1,n):dp[i][j]=dp[i-1][j]+dp[i][j-1]returndp[m-1][n-1]#调用sol=Solution()print(sol.uniquePaths(3,7))#传递两个参数```如果我们尝试调用sol.uniquePaths(3),则会出现错误,因为缺少第二个参数n。因此,请确保在调用时提供了两个参数。</think> 针对TypeError: `Solution.uniquePaths()` missing required positional argument 'n' 的问题,这是由于调用方法时缺少必要的参数导致的。以下是详细分析和解决方案: ### 问题原因分析 1. **方法签名不匹配** `uniquePaths` 方法需要接收特定的位置参数(如 `m` 和 `n`),但调用时只传递了部分参数。例如: ```python class Solution: def uniquePaths(self, m: int, n: int) -> int: # 需要两个参数 ... # 错误调用(缺少n) Solution().uniquePaths(3) # ❌ 缺少第二个参数n ``` 2. **实例化与调用分离问题** 若通过类名直接调用方法而非实例方法,会遗漏实例参数: ```python # 错误调用(未实例化) Solution.uniquePaths(3, 7) # ❌ 缺少self参数 ``` 3. **方法绑定类型错误** 静态方法定义不当会导致参数传递混乱: ```python class Solution: @staticmethod def uniquePaths(m, n): # 静态方法无self参数 ... # 错误实例化调用 Solution().uniquePaths(3, 7) # ❌ 多传了self参数 ``` ### 解决方案 #### ✅ 方案1:补充完整参数(推荐) 确保传递所有必需参数: ```python class Solution: def uniquePaths(self, m: int, n: int) -> int: dp = [[1] * n for _ in range(m)] for i in range(1, m): for j in range(1, n): dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[-1][-1] # 正确调用 print(Solution().uniquePaths(3, 7)) # 输出网格路径数 ``` #### ✅ 方案2:使用默认参数 在方法定义中设置默认值避免遗漏: ```python class Solution: def uniquePaths(self, m: int, n: int = 1): # n默认值为1 if n == 1: # 边界情况处理 return 1 ... # 灵活调用 Solution().uniquePaths(3) # 使用默认n=1 Solution().uniquePaths(3, 7) # 显式指定n ``` #### ✅ 方案3:正确使用静态方法 统一静态方法的调用方式: ```python class Solution: @staticmethod def uniquePaths(m: int, n: int) -> int: ... # 通过类名调用(无需实例化) Solution.uniquePaths(3, 7) # ✅ ``` ### 关键检查点 1. 方法定义中参数数量(包括 `self`) 2. 调用时实参与形参匹配度 3. 方法类型(实例方法/静态方法)与调用方式的一致性 > 路径计数问题中,动态规划是常见解法:通过二维数组存储中间状态,时间复杂度为 $O(m \times n)$,空间复杂度可优化至 $O(n)$[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值