Leetcode算法——62、不重复路径(unique paths)

76 篇文章 1 订阅

一个机器人位于一个m*n的网格的左上角。

它每次只能向下或向右移动一格。它试图到达网格的右下角。

求有多少种不重复的路径?

备注:
m和n最大为100.

示例1:

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right

示例2:

Example 2:
Input: m = 7, n = 3
Output: 28

思路

1、数学法

路径数是可以通过数学公式直接计算出来的。

对于m*n的网格,从左上角到右下角,无论怎么走,都必定包含 m-1 次右移和 n-1 次下移。

因此问题转换为:将 m-1 个黑球和 n-1 个白球串成长度为 m+n-2 的队列,问排列方式有几种。

这是一个排列组合文体,方法为:从 m+n-2 个空位置中,选出 m-1 个位置,放黑球,其他位置放白球。

因此排列方式有 C m + n − 2 m − 1 = ( m + n − 2 ) ! / [ ( m − 1 ) ! ( n − 1 ) ! ] C_{m+n-2}^{m-1} = (m+n-2)! / [(m-1)!(n-1)!] Cm+n2m1=(m+n2)!/[(m1)!(n1)!] 种。

2、动态规划

设左上角坐标为(0,0),右下角坐标为(m,n)。

则走到(m,n)的路径数 = 走到(m-1,n)的路径数 + 走到(m,n-1)的路径数。

这是因为:

  • 要想走到(m,n),必定会经过(m-1,n)或(m,n-1)的其中一个,因此需要相加。
  • 经过其中一个之后,只有一种走法可以到达终点,没有其他选择,因此不用乘以系数。
  • 经过其中一个之后,必定不会经过另外一个,不会有重叠,因此不用减去他们的交集。

python实现

import math
def uniquePaths1(m, n):
    """
    :type m: int
    :type n: int
    :rtype: int
    数学法。
    """
    return int(math.factorial(m+n-2) / math.factorial(m-1) / math.factorial(n-1))

def uniquePaths2(m, n):
    """
    :type m: int
    :type n: int
    :rtype: int
    动态规划。
    """
    dp = [[1] * n for _ in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
    return dp[-1][-1]
    

if '__main__' == __name__:
    m, n = 7, 3
    print(uniquePaths2(m, n))
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值