LeetCode--62:不同路径(java)

原题链接
思路:动态规划
用 dp[ i ][ j ] 表示到达 (i , j) 位置的最多的路径数

动态方程:dp[ i ][ j ] = dp[ i-1 ][ j ] + dp[ i ][ j-1 ]

意思是(i, j)位置只可能是从上面的位置或者左边的位置过来的,所以该位置的最大路径数就是上面和左边位置的最大路径数之和。

注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是边界上的位置,所以只能为 1
(因为到达这些位置的最大路径数都只能是 1 条路径,第一行上的位置只可能是从左边位置来的,第一列上的位置只可能是从上面位置来的)

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 j = 0;j < n;j++) dp[0][j] = 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];
    }
}

上述方法使用的是二维数组,完整的存储了每一个位置上的解,其实可以优化,使用一维,因为(i, j)位置只可能是从上面的位置或者左边的位置过来的,所以我们最多只需要存储上一层的解即可,无需存储所有位置的解。
使用一个 cur 数组保留当前行上的所有位置的解,每遍历一行,就重写一遍 cur 数组(比如遍历完第 i 行之后,cur数组记录的就是第 i 行上每个位置的解)。遍历完所有行之后,cur 数组记录的就是最后一行上每个位置的解,它的尾元素就是到达最后一行最后一列位置的解。

优化空间

class Solution {
    public int uniquePaths(int m, int n) {
        int[] cur = new int[n];
        Arrays.fill(cur,1);//初始化第一行的位置
        for (int i = 1; i < m;i++){
        //由于j 从 1 开始,所以cur[0]就代表了每一行的第一列的位置,一直都是1
            for (int j = 1; j < n; j++){
                cur[j] += cur[j-1] ;
            }
        }
        return cur[n-1];
    }
}

cur[ j ] += cur[ j - 1 ] 这行代码写成 cur[ j ] = cur[ j ] + cur[ j - 1 ] 更好理解,cur[ j ] 是上一行 j 列的位置,也就是上面的位置,cur[ j - 1 ] 是左边的位置。

发布了24 篇原创文章 · 获赞 3 · 访问量 549

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/103986528