原題:
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲“Finish”)。
問總共有多少條不同的路徑?
例如,上圖是一個7 x 3 的網格。有多少可能的路徑?
說明:m 和 n 的值均不超過 100。
示例 1:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/unique-paths
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解法一:排列組合
思路:排列組合
因爲機器到底右下角,向下幾步,向右幾步都是固定的。
比如,m=3, n=2,我們只要向下 1 步,向右 2 步就一定能到達終點。
class Solution(object):
def uniquePaths(self, 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)) # 使用內置函數factorial進行階乘。
解法二(動態規劃):
思路:我們令 dp[i][j] 是到達 i, j 最多路徑
動態方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
注意,對於第一行 dp[0][j],或者第一列 dp[i][0],由於都是在邊界,所以只能爲 1
程序一:
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
dp = [[1]*n] + [[1]+[0] * (n-1) for _ in range(m-1)] # 初始化dp數組。
#print(dp)
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]
程序二:
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
cur = [1] * n
for i in range(1, m):
for j in range(1, n):
cur[j] += cur[j-1]
return cur[-1]
解法三:遞歸:
程序一:
** 超出時間限制**
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
if(m==1 or n==1):
return 1
else:return self.uniquePaths(m,n-1)+self.uniquePaths(m-1,n)
程序二
** 使用a數組記錄路徑數,當路徑不爲0的時候說明該位置已經求算過,直接return。 **
class Solution(object):
a = [[0] * (101) for i in range(101)]
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
if m == 1 or n == 1:
return 1
if self.a[m][n] > 0: return self.a[m][n]
self.a[m][n] = self.uniquePaths(m,n-1)+self.uniquePaths(m-1,n)
return self.a[m][n]