力扣62. 不同路径

题目来源(力扣):

https://leetcode.cn/problems/unique-paths/description/

题目描述:

一个机器人位于一个 m x n 网格的左上角 。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
问总共有多少条不同的路径?

基本思路:

依旧是动态规划入门级别题目,用于熟悉动态规划解决问题的5步方法论。

代码实现:

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 1.定义dp数组 dp[i][j]表示从左上角(0,0)到位置(i,j)的走法为dp[i][j]
        vector<vector<int>> dp(m, vector<int>(n));

        // 2.确定递推公式
        // dp[i][j]=dp[i-1][j]+dp[i][j-1];

        // 3.初始化
        for (int i = 0; i < m; i++)
            dp[i][0] = 1;
        for (int j = 0; j < n; j++)
            dp[0][j] = 1;

        // 4.确定遍历顺序
        // 从左上方到右下方,但是优先遍历行
        // 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];
        // }
        // 或者优先遍历列:
        for (int j = 1; j < n; j++) {
            for (int i = 1; i < m; i++)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }

        // 5.打印部分dp数组以确认是否符合预期
        // for (int i = 0; i < m; i++) {
        //     for (int j = 0; j < n; j++) {
        //         cout << dp[i][j] << " ";
        //     }
        //     cout << endl;
        // }

        return dp[m - 1][n - 1];
    }
};

时间复杂度

O(m*n)

补充

该二维数组可以优化为一维,
因为dp[i][j]只与dp[i-1][j]和dp[i][j-1]有关
dp[i-1][j]与dp[i][j]同列,且相邻;dp[i][j-1]与dp[i][j]同行,且相邻
利用这个性质可以将数组缩小为一维的dp[j]

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 1.定义dp数组
        vector<int> dp(n + 1);

        // 2.确定递推公式
        // dp[j]=dp[j]+dp[j-1];
        // 等号右边,dp[j]就相当于原来的dp[i-1][j]、dp[j-1]就相当于原来的dp[i][j-1]

        // 3.初始化
        for (int j = 0; j < n; j++)
            dp[j] = 1;

        // 4.确定遍历顺序 只能一行一行遍历
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++)
                dp[j] = dp[j - 1] + dp[j];
            // 5.打印(部分)dp数组以确认是否符合预期
            // for(int j=0;j<n;j++)
            //     cout<<dp[j]<<" ";
            // cout<<endl;
        }

        return dp[n - 1];
    }
};
posted @ 2024-11-27 12:13  HB_Computer  阅读(24)  评论(0)    收藏  举报