题目
一个机器人位于一个 m x n 网格的左上角 (0,0)。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(m-1,n-1)。 问总共有多少条不同的路径?
思路
通过画图,当m = 2,n = 2的时候发现终点 m-1,n-1的值是2,即 m-1,n-1 等于m-2,n-1 + m-1,n-2的值。第m或者n其中有一个是1的时候就只有一条路,那么就将第一行和第一列赋值为1。
代码
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(i == 0 || j == 0){
dp[i][j] = 1;//初始化第一行和第一列的值
}else{
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
优化
思路:一般dp能优化即将二维数组变一维,在到常量的思路。因为:遍历总是从做向右的,在从上向下的。所以,我用一个一维数组保存上一行的数据,用一个变量保存前一个数的值。即可将空间变为N而不是M*N
int[] dp = new int[n];
int pre = 0;
for(int i = 0; i < n; i++){
dp[i] = 1;
}
for(int i = 1; i < m; i++){
for(int j = 0; j < n; j++){
if(j == 0){
pre = 1;//初始化第一行和第一列的值
}else{
dp[j] = dp[j]+pre;
pre = dp[j];
}
}
}
return dp[n-1];