62. 不同路径
动态规划(二维数组):
java
class Solution {
public int uniquePaths(int m, int n) {
//子问题:走到目标的左边以及上边的方法和
//从左上角走到dp[i][j]有多少种路径
//状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
//从小到大
int[][] dp = new int[m][n];
dp[0][0] = 1;
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
if(i ==0 && j==0){
continue;
}
dp[i][j] = (i>0 ? dp[i-1][j]:0) + (j>0 ? dp[i][j-1]:0);
}
}
return dp[m-1][n-1];
}
}
时间复杂度:O(M*N)
空间复杂度:O(M*N)
动态规划(一维数组):
java
class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
//第一行只有1
for(int i = 0;i<n;i++){
dp[i] = 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];
}
}
时间复杂度:O(M*N)
空间复杂度:O(N)
优化思路:就是将二维的m转化为for循环里的i,按层去处理,因为dp[i][j]只和自己左边还有上面的数值有关