LeetCode 62題 不同路徑

2021-10-09 16:34:00 字數 2251 閱讀 8748

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。

問總共有多少條不同的路徑?

例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?

示例 1:

輸入: m = 3, n = 2

輸出: 3

解釋:從左上角開始,總共有 3 條路徑可以到達右下角。

1. 向右 -> 向右 -> 向下

2. 向右 -> 向下 -> 向右

3. 向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3

輸出: 28

1 <= m, n <= 100

題目資料保證答案小於等於 2 * 10 ^ 9

這個問題和爬樓梯的問題看著很類似,最後都是求總共有多少中走法或者路徑。這種問題看著毫無章法,其實暗地中都有著彼此的聯絡。首先我們先隨便代入幾個值,看有幾條路徑。

例子1

輸入m=3,n=1

從左上角開始,總共有 1 條路徑可以到達右下角。

1、向右 ->向右

例子2

輸入m=1,n=4

從左上角開始,總共有 1 條路徑可以到達右下角。

1、向下 ->向下 ->向下

例子3

輸入m=2,n=3

從左上角開始,總共有 3 條路徑可以到達右下角。

1、向右 ->向下 ->向下

2、向下 ->向下 ->向右

3、向下 ->向右 ->向下

上面幾個示例和例子中可以發現規律:

如果m或者n有乙個為1的話,就只有乙個條路徑。

如果m和n互換,最後結果還是一樣的。

似乎上面的的兩個發現,任然解決不了問題,接著我們可以多算幾組,然後將算好的結果填到對應的**中。(畫的有點醜)

從中不難發現此題的規律,**的第一行和第一列都為1,而其他地方的值分別是它左邊和上面相鄰的值的和。

提取出來就是: num(m,n) = num(m-1,n)+num(m,n-1)

方法一:遞迴法(leetcode中超時)

class

solution

}

方法二:動態規劃演算法

1、二維陣列方法

class

solution

}return dp[m -1]

[n -1];}}

2、優化為一維陣列

class

solution

}return a[n-1];}}

其實對這些數字敏感的話,馬上就能發現它們就是楊輝三角嘛。

而楊輝三角中有一條特性:第n行的m個數可表示為 c(n-1,m-1),即為從n-1個不同元素中取m-1個元素的組合數。舉個例子:第五行第二個為4,也就是從4個元素中取乙個的組合數,等於4。

而將**中的資料轉換成接近楊輝三角排列方式

比如輸入的是m=7,n=3,那麼該數在第9行,第三個,通過自由組合即可算出值。

方法三:公式法

class

solution

public

intfactorial

(int n,

int m)

return result;

}}

如果m,n大於10,會出現溢位的情況。

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。示例 ...