1. 程式人生 > 其它 >LeetCode——62.不同路徑

LeetCode——62.不同路徑

技術標籤:力扣leetcode

一、題目

一個機器人位於一個 m x 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 * 109

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/unique-paths

二、java解法

1.排列組合法

class Solution {
    public int uniquePaths(int m, int n) {
        long ans = 1;
        for (int x = n, y = 1; y < m; ++x, ++y) {
            ans =
ans * x / y; } return (int) ans; } }

思路:由圖可知,機器人一共需要走m+n-2步,每到一個格子可以選擇向下和向右走這兩種方式,用組合的知識可以知道我們只需要從m+n-2中選出m-1步往下走或者n-1步往右走就可以了。即計算

在這裡插入圖片描述

2.動態規劃

class Solution {
    public 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]; } }


我們把dp[m-1][n-1]設為到達第n行第m列的所有可能的路徑數,我們可以很快的想到,dp[0][n-1]和dp[m-1][0]都為1,因為只有一條路徑可以到達,我們現在看到達dp[1][1]有兩種路徑可以走即從dp[0][1]下來或者從dp[1][0]過來,所以dp[1][1]=2,那麼到達dp[1][2]我們可以看到也是兩種路徑可以走即從dp[0][2]下來或者從dp[1][1]過來那麼dp[1][2]=dp[0][2]+dp[1][1],我們可以發現dp[m-1][n-1]=dp[m-2][n-1]+dp[m-1][n-2]。每一個格子的走法都可以化簡為到達的相鄰前兩個格子的走法數相加,這樣我們的轉移方程就確定了。

再優化一下

class Solution {
    public int uniquePaths(int m, int n) {
        int dp[]=new int[n];
        for(int i=0;i<n;i++){
            dp[i] = 1;
        }

        for(int j=1;j<m;j++){
            for(int i=1;i<n;i++)
            dp[i]+=dp[i-1];
        }
        return dp[n-1];
    }
}

上面的二維陣列可以使用一維陣列的迭代完成,這樣減少了空間的使用。