一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?

示例 1:

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

示例 2:

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

分析:m表示列,n表示行

以示例2举例

解法一:用一个n * m的二维数组result来表示上表中元素,其中result[i][j]表示从原点出发到达第i行,第j列的路径总数

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        result = [[0 for i in range(m)] for j in range(n)]
        #用0初始化二维数组
        for i in range(m):
            result[0][i] = 1
        #第一行元素全为1,只有一条路径,从原点一直往右走
        for j in range(n):
            result[j][0] = 1
        #第一列元素全为1,只有一条路径,从原点一直往下走
        for i in range(1,n):
            for j in range(1,m):
                result[i][j] = result[i][j-1] + result[i-1][j]
        #除第一行第一列,其余所有点的值由前一行同一列加前一列同一行所得
        return result[n-1][m-1]

解法二:和解法一思路相同,只是用两个一维数组来表示,解法一的空间复杂度为O(n * m)解法二的空间复杂度为O(2 * m)当然也可以换为O(2 * n)

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        pre = [1] * m
        #初始化第一行
        for i in range(n-1):
            last = [1] + [0] * (m-1)
            #初始化第二行
            for j in range(1,m):
                last[j] = last[j-1] + pre[j]
            pre = last
            #将后一行的值赋给钱一行
        return pre[-1]

解法三:总需要走(m + n - 2)步,其中(m -1)步向右,(n-1)步向下,是一个排列组合问题

    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        t = m + n - 2
        down = 1
        #分子
        up =1
        #分母
        for i in range(1,n):
            down *= i
            up *= t
            t -= 1
        return up//down
01-03 13:52