LeetCode62 不同路径

37 阅读1分钟

leetcode.cn/problems/un…

image.png

解法一:自顶向下的递归dp + 备忘录

func uniquePaths(m int, n int) int {
    // 备忘录
    memo := make([][]int, m)
    for i := range memo {
        memo[i] = make([]int, n)
    }
    return dp(m-1, n-1, memo)
}

// 定义:从 (0, 0) 到 (x, y) 有 dp(x, y) 条路径
func dp(x int, y int, memo [][]int) int {
    // base case
    if x == 0 && y == 0 {
        return 1
    }
    if x < 0 || y < 0 {
        return 0
    }
    // 避免冗余计算
    if memo[x][y] > 0 {
        return memo[x][y]
    }
    // 状态转移方程:
    // 到达 (x, y) 的路径数等于到达 (x - 1, y) 和 (x, y - 1) 路径数之和
    memo[x][y] = dp(x-1, y, memo) + dp(x, y-1, memo)
    return memo[x][y]
}
  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m*n)