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