leetcode62 不同路徑

2021-10-03 19:14:22 字數 2691 閱讀 4841

乙個機械人位於乙個 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。示例 ...