高端交互式網站建設百度百科詞條
62. 不同路徑
一個機器人位于一個 m?nm * nm?n 網格的左上角 (起始點在下圖中標記為 “Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。
問總共有多少條不同的路徑?
實例 1:
輸入:m = 3, n = 7
輸出:28
示例 2:
輸入:m = 3, n = 2
輸出:3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
輸入:m = 7, n = 3
輸出:28
示例 4:
輸入:m = 3, n = 3
輸出:6
提示:
- 1 <= m, n <= 100
- 題目數據保證答案小于等于 2?1092 * 10^92?109
思路:(動態(tài)規(guī)劃)
由于每次只能向下或者向右移動,所以到達任意一個位置,不是從上面到達就是從左邊到達,從而到達該位置的路徑就是這兩個方向之和:
- 定義一個 m*n 矩陣dp,用于存放到達當前位置的所有路徑;
- 第一列和第一行比較特殊,分別只能從上方到達,從左面到達,因此只用一條路,賦值為1;
- 其余位置要比較從左面,從上面到達,所以動態(tài)方程為:dp[i][j] = dp[i-1][j] + dp[i][j-1]
代碼:(Java)
public class difPath {public static void main(String[] args) {// TODO Auto-generated method stubint m = 3, n = 7; System.out.println(uniquePaths(m, n));}public static int uniquePaths(int m, int n) {int [][] dp = new int[m][n];for(int i = 0; i < m; i++) {dp[i][0] = 1;}for(int j = 0; j < n; j++) {dp[0][j] = 1;}for(int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m-1][n-1];}
}
運行結果:
復雜度分析:
時間復雜度:O(m?n) 。
空間復雜度:O(m?n) 。(優(yōu)化:因為我們每次只需要 dp[i-1][j],dp[i][j-1],所以我們只要記錄這兩個數,所以空間復雜度可以為 :O(1) . )
注:僅供學習參考!
題目來源:力扣。