LeetCode62 不同路径

本题的主要思路就是动态规划问题。首先找动态规划的递归表达式,假如咱们站在终点看,那机器人来的方向有两个,左边方向和上边方向,也就是到达此位置的路径数目就是这两个方向的数目之和。借助矩阵很容易写出递归表达式,num[i][j]=num[i-1][j]+num[i][j-1]。需要注意的点是当位置在矩阵的最上边的行和最左侧的行时,路径数为1,因为机器人只能往右边和下边走,不能往上或者往左边拐。

代码如下:

class Solution {
public:
    int uniquePaths(int m, int n) {//动态规划
        if(m<1||n<1){
            return 0;
        }
        int num[m][n];
        for(int r=0;r<m;r++)
        {//计算顶行的路径数
            num[r][0]=1;
        }
        for(int c=1;c<n;c++)
        {//计算左侧列的路径数
            num[0][c]=1;
        }
        for(int i=1;i<m;i++)
        {//逐行进行计算
            for(int j=1;j<n;j++)
            {//在某一行中,从左边和上边的方向到达位置
               num[i][j]=num[i-1][j]+num[i][j-1];  
            }
        }
        return num[m-1][n-1];
    }
};

当然了,代码还有优化的地方,那就是用一维数组代替二维数组可以节约空间。递归表达式是num[i]+=num[j-1],逐行计算。需要注意的点是在递归方程计算之前num[i]记录的是来自上一行方向的路径数,num[i-1]是来自左边的路径数。代码如下:

class Solution {
public:
    int uniquePaths(int m, int n) {//动态规划
        if(m<1||n<1){
            return 0;
        }
        vector<int> num(n,1);
        for(int i=1;i<m;i++)
        {//逐行进行计算
            for(int j=1;j<n;j++)
            {//在某一行中,从左边和上边的方向到达位置
                num[j]+=num[j-1];      // from num[i][j]=num[i-1][j]+num[i][j-1];  
            }
        }
        return num[n-1];
    }
};

猜你喜欢

转载自blog.csdn.net/Jeff_Winger/article/details/81484395
今日推荐