zoukankan      html  css  js  c++  java
  • 62. 不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    问总共有多少条不同的路径?

    例如,上图是一个7 x 3 的网格。有多少可能的路径?

    说明:m 和 的值均不超过 100。

    示例 1:

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

    示例 2:

    输入: m = 7, n = 3
    输出: 28

    因为机器人每次只能向左或者向右移动,所以当机器人到达一个点的时候,只有两种可能:
    • 从该点的上面到达
    • 从该点的左边到达

    所以,我们可以得到这样的关系,设dp[i][j]是到达(i, j)所需要的时间, 因而dp[i][j] = dp[i-1][j]+dp[i][j-1];

    边界条件是该等式发生在最左边和最右边,通过条件可知,到达这些位置的点,只有一条路,一路向下,或者一路向右; 因而dp[i][0]=1; dp[0][j]=1;

     1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         vector<vector<int>> dp(m, vector<int>(n, 1));
     5         int i, j;
     6         for(i=1; i<m; i++)
     7             for(j=1; j<n; j++)
     8                 dp[i][j] = dp[i-1][j]+dp[i][j-1];
     9         return dp[m-1][n-1];
    10     }
    11 };

    上面一种算法的时间复杂度是O(m*n); 通过观察我们可以知道 每次更新dp[i][j], 我们只需要dp[i-1][j](同一行), 和dp[i][j-1](同一列). 所以我们维护两个数组就够了;

    从第一行开始遍历,用row[j] 表示移动到当前点的上面的点需要的步数, col[i]表示移动到该点需要的步数, 这种方法思维上有点绕, 不过节省内存

    class Solution {
    public:
        int uniquePaths(int m, int n) {
            int t=max(m, n);
            vector<int> col(t, 1), row(t, 1);
            for(int i=1; i<n; i++){
                for(int j=1; j<m; j++)
                    col[j] = col[j-1] + row[j];
                swap(col, row);
            }
            return row[m-1];
        }
    };

    进一步发现row的值其实等于上一次遍历的col; 则col[j] = col[j-1]+row[j] 可以更换为col[j] = col[j-1] + col[j]; col[j-1]是当前行已经更新了的数据, 但是col[j]还是上一次的数据,还未更新; 

    class Solution {
    public:
        int uniquePaths(int m, int n) {
            int t=max(m, n);
            vector<int> col(t, 1);
            for(int i=1; i<n; i++)
                for(int j=1; j<m; j++)
                    col[j] += col[j-1];
            return col[m-1];
        }
    };
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    C++解析一些我们需要的数据
    C语言0数组、柔性数组使用介绍
    正点原子T100智能焊台-试用-拆机测评
    简单工厂模式、工厂模式、抽象工厂模式比较
    一次小模块的使用过程-LC12S无线模块介绍
    正点原子DS100拆解全过程-硬件工程师必备
    STM32通过rosserial接入ROS通讯开发
    Linux下实现Firewalld Net 外网端口转发至内网
    Windows中使用netsh portproxy端口转发
    低延迟网穿透工具FRP
  • 原文地址:https://www.cnblogs.com/mr-stn/p/9210819.html
Copyright © 2011-2022 走看看