62. 不同路徑
阿新 • • 發佈:2020-07-27
一個機器人位於一個 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; } }