leetcode hot100 之 不同路径

本文解析了如何利用动态规划解决LeetCode上的独特路径问题,通过示例和代码展示了机器人在网格中从左上角到右下角的不同走法。介绍了转移方程和空间复杂度优化技巧,是动态规划入门的好例子。

题目

给定一个 m x n 的网格,机器人位于网格的左上角,每次只能向下或向右移动一步,求问机器人走到网格的右下角一共有多少种路径。

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

原题链接:https://leetcode-cn.com/problems/unique-paths/

思路

动态规划。设 dp[i][j] 表示机器人走到 (i, j) 的位置有多少种路径。由于机器人只能向下或向右走,那么机器人走到 (i, j) 只会从 (i-1, j) 或 (i, j-1) 过来,那么转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1]
而第一行和第一列,都只有一种走法,故初始化其为 1。

  • 复杂度分析
    • 时间复杂度 O(m x n)
    • 空间复杂度 O(m x n)。PS:由于 dp[i][j] 只和 i-1 或 j - 1 相关,即当前状态只和上一次状态有关。dp数组其实可以只用大小为 2m 或 2n 来表示,空间复杂度可以降为O(min(m, n))。这里偷懒,就先不写了。。。

代码

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 直接初始化全为1
        vector<vector<int>> dp(m, vector<int>(n, 1));
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值