leetcode 62. 不同路径 [java/动态规划/优化动态规划空间]

205 阅读1分钟

题目

一个机器人位于一个 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];