# 0062. Unique Paths ###### tags: `Leetcode` `Medium` `动态规划` Link: https://leetcode.com/problems/unique-paths/ ## 思路 两种方法 一个是用排列组合(还没理解) 一个是用动态规划,要注意的是这里不用建m*n的阵列,只要存一行的就好 ## Code ### 方法一 ```c= ``` ### 方法二 ```c= class Solution { public: int uniquePaths(int m, int n) { int dp[n]; for(int i = 0;i < m;i++){ if(i == 0){ for(int j = 0;j < n;j++){ dp[j] = 1; } } else{ for(int j = 1;j < n;j++){ dp[j] = dp[j]+dp[j-1]; } } } return dp[n-1]; } }; ``` ## Result Runtime: 0 ms, faster than **100.00%** of C++ online submissions for Unique Paths. Memory Usage: 5.8 MB, less than **86.65%** of C++ online submissions for Unique Paths. ## 思路in Java ### 方法一 可怜的我就是用的m*n的二维数组,不过我尝试想了能不能优化空间,没想出来。 那我再想想怎么只要存一行 #### 先来一个简略版的 ```java= 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 i = 0; i < n; i++) { dp[0][i] = 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]; } } ``` 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:35.3 MB, 在所有 Java 提交中击败了49.37%的用户 #### 空间优化版 🐂啊这种优化,看着比较晕,但是手推一遍就懂里 相当于是每次更新一行 ```java= class Solution { public int uniquePaths(int m, int n) { int[] dp = new int[n]; for (int i = 0; i < m; i++) { if (i == 0) { for (int j = 0; j < n; j++) { dp[j] = 1; } } else { for (int j = 1; j < n; j++) { dp[j] += dp[j - 1]; } } } return dp[n - 1]; } } ``` 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:34.9 MB, 在所有 Java 提交中击败了96.79%的用户 ## 方法二:排列组合 从左上角移动到右下角一共需要移动$m+n-2$次,其中$m-1$向下移动,$n-1$向右移动。那么总的路径数,就是从$m+n-2$次移动种挑出$m-1$个,也就是组合数$C_{m+n-2}^{m-1}$。 注意:$C_{m+n-2}^{m-1}=C_{m+n-2}^{n-1}=\frac{(m+n-2)!}{(m-1)!(n-1)!}$。 ```java= 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; } } ```