您的位置:首页 > 产品设计 > UI/UE

[LeetCode]62. Unique Paths

2016-12-12 17:21 337 查看
https://leetcode.com/problems/unique-paths/

naive做法是经典DP,很直观。

naive解法:

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


排列组合解法:

C(total, down),从总步数里面选down步向下的,属于组合问题,每一步down都是一样的

public class Solution {
public int uniquePaths(int m, int n) {
long res = 1;
// 总步数
int total = m + n - 2;
// 要向下走的步数
int down = n - 1;
for (int i = 1; i <= down; i++) {
res = res * (total - down + i) / i;
}
return (int) res;
}
}


优化DP解法:
用到的DP只有下方元素和右侧元素,其实可以合并到一个数组里面。在遍历该数组的时候,是从下往上的,下方是代表之前的下方元素,上方代表之前未优化的右侧元素。空间复杂度O(min(m, n))这里面有一个trick如下注释。

public class Solution {
public int uniquePaths(int m, int n) {
if (m < n) {
// So trick.
return uniquePaths(n, m);
}
int[] dp = new int
;
Arrays.fill(dp, 1);
for (int j = m - 2; j >= 0; j--) {
for (int i = n - 2; i >= 0; i--) {
dp[i] += dp[i + 1];
}
}
return dp[0];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: