您的位置:首页 > 其它

不同路径(LeetCode)

2019-01-06 21:52 267 查看

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

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

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

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

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

示例 1:

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

示例 2:

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

 

'''

因为要准备一些认证,所以暂时不能采用Python来刷题了。

这道题一开始我是用排列组合来做的,然后就超出数字的范围了,即使是开了 long long int

emmmm...我感觉我人生最黑暗的时候要来临了。

所以只能改用dp。

已知状态转移方程

因为路线只能向下或向右,所以

当i,j>=2时,dp[i,j] = d[i-1,j] + d[i,j-1] 。

注意。它的7x3矩阵是相当于数组的3x7

观察到d[0][j]和d[i][0]实际上都是只有一种走法,所以有如下代码

'''

 

class Solution {
public:
    int uniquePaths(int m, int n) {
        int nums
[m] = {0};
        for(int i=0;i<m;i++)nums[0][i] = 1;
        for(int i=0;i<n;i++)nums[i][0] = 1;
        for(int i=1;i<n;i++)
            for(int j=1;j<m;j++)
                nums[i][j] = nums[i-1][j] + nums[i][j-1];
        return nums[n-1][m-1];
    }
};

'''

Python倒是可以用排列组合解,因为Python的长度够用

排列组合解法:

已知m,n为重点,1,1为起点,则要走的步数为m-1 + n-1

然后思考一下,这里它只能向下或向右,那就说明了有m-1步是向右的,n-1步是向下的

那用排列组合C(n+m-2)(n-1)就可以得出解

'''

class Solution:
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        ln,lm = 1,1
        for i in range(1,n):ln = ln*i
        for i in range(m,n+m-1): lm = lm*i
        return lm//ln

执行用时: 44 ms, 在Unique Paths的Python3提交中击败了94.81% 的用户

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: