1. 程式人生 > 實用技巧 >62. 不同路徑

62. 不同路徑

一個機器人位於一個 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

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


思路:

一種與上一題類似,每次都記錄到當前位置的有幾種疊加

class Solution {
    public int uniquePaths(int m, int n) {
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        for (int i = 1; i < m; i++) {
            
for (int j = 1; j < n; j++) { dp[j] = dp[j] + dp[j - 1]; } } return dp[n - 1]; } }

另一種用排列組合的方法

這是一個組合問題。機器人總共移動的次數 S=m+n-2,向下移動的次數 D=m-1,那麼問題可以看成從 S 中取出 D 個位置的組合數量,這個問題的解為 C(S, D)。

class Solution {
    public int uniquePaths(int m, int n) {
        
int S = m + n - 2; // 總共的移動次數 int D = m - 1; // 向下的移動次數 long ret = 1; for (int i = 1; i <= D; i++) { ret = ret * (S - D + i) / i; } return (int) ret; } }