1. 程式人生 > >LeetCode筆記——62不同的路徑

LeetCode筆記——62不同的路徑

題目:

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

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

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

說明:m 和 n 的值均不超過 100。

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3
輸出: 28

思路:整體上著這兩種思路都是遞迴的思想。建立一個二維陣列,每個元素中儲存著對應各自能夠走到終點的路徑數。由於機器人只能向下或者向右走一步,所以對於上邊界和左邊界來說比較特殊。可以直接設定這兩部分為1 或者像第二個程式那樣分別討論這兩種特殊情況;對於其他各自來說,能夠走到終點的路徑數等於左邊各自的路徑數加上上面格子的路徑數。

程式碼:

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] nums = new int[m][n];
        for (int i = 0 ;i < m;i++) {
            for (int j = 0; j < n; j++) {
                if(i == 0 || j == 0)
                    nums[i][j] = 1;
                else
                    nums[i][j] = nums[i - 1][j] + nums[i][j - 1];
            }
        }
        return nums[m - 1][n - 1];
    }
}

執行最快的程式

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] path=new int[m][n];
        path[0][0]=1;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==0&&j==0)continue;
                else if(i==0&&j!=0){
                    path[i][j]=path[i][j-1];
                }
                else if(i!=0&&j==0){
                    path[i][j]=path[i-1][j];
                }
                else path[i][j]=path[i-1][j]+path[i][j-1];
            }
        }
        return path[m-1][n-1];
    }
}