乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。問總共有多少條不同的路徑?
例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?
示例 1:
輸入: m = 3, n = 2
輸出: 3
解釋:從左上角開始,總共有 3 條路徑可以到達右下角。
向右 -> 向右 -> 向下
向右 -> 向下 -> 向右
向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
由於只要求得到路徑的個數,但是路徑具體情況不需要給出來,暗示這是一道典型的適合使用動態規劃解決的題目,它和爬樓梯等都屬於動態規劃中最簡單的題目,因此也經常會被用於面試之中。
遞迴搜尋,其實類似二叉樹的搜尋
求解動態規劃問題,可以先從遞迴、回溯等方法著眼,因為動態規劃和它們是反方向的。
class
solution
:# m為列數,n為排數
# 遞迴搜尋,相當於搜尋一顆二叉樹,複雜度o(2^n)
defuniquepaths
(self, m:
int, n:
int)
->
int:
return self.path(m, n,0,
0)defpath
(self, m, n, m_index, n_index)
:# 對於最下面一排的格仔來說,路徑只有一條,就是一路向右
# 對於最右邊一列的格仔來說,路徑只有一條,就是一路向下
if m_index == m -
1or n_index == n -1:
return
1# 對於某個格仔來說,
# 它到終點的路徑個數等於它下面乙個格仔到終點的路徑個數+它右邊乙個格仔到終點的路徑個數
return self.path(m, n, m_index+
1, n_index)
+ self.path(m, n, m_index, n_index+
1)
記憶性遞迴搜尋
class
solution
:# 遞迴搜尋,但是採用記憶化方式
defuniquepaths
(self, m:
int, n:
int)
->
int:
# m為列數,n為排數
mem =[[
0]*m for _ in
range
(n)]
return self.path(m, n,0,
0, mem)
defpath
(self, m, n, m_index, n_index, mem)
:# 對於最下面一排的格仔或者最右邊一列的格仔來說,路徑只有一條
if m_index == m -
1or n_index == n -1:
return
1if mem[n_index]
[m_index]!=0
:return mem[n_index]
[m_index]
mem[n_index]
[m_index]
= \ self.path(m, n, m_index+
1, n_index, mem)
+ self.path(m, n, m_index, n_index+
1, mem)
return mem[n_index]
[m_index]
動態規劃
時間複雜度o(n2), 空間複雜度o(n2),
class
solution
:# m為列數,n為排數
# 動態規劃,o(n^2), 動態規劃的遞推順序往往和遞迴是相反的
# 轉移方程就是,
#(i,j)這個位置的路徑數目=(i+1,j)這個位置到終點的路徑數目+(i,j+1)這個位置到終點的路徑數目
defuniquepaths
(self, m:
int, n:
int)
->
int:
mem =[[
0]*m for _ in
range
(n)]
for j in
range
(m):
mem[n-1]
[j]=
1for i in
range
(n):
mem[i]
[m-1]=
1for i in
range
(n-2,-
1,-1
):for j in
range
(m-2,-
1,-1
):mem[i]
[j]= mem[i+1]
[j]+ mem[i]
[j+1
]return mem[0][0]
Leetcode 62 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...
leetcode 62 不同路徑
時間複雜度o n2 def uniquepaths m,n 計算路徑的個數 memo 0 for j in range n for i in range m for i in range m for j in range n if i 0 and j 0 memo i j 1 elif j 0 me...
LeetCode 62 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...