java算法day39 | 动态规划part02 ● 62.不同路径 ● 63. 不同路径 II

62.不同路径




思路: 本题非常巧妙。

第一步:定义一个dp数组存储到达每个位置的路径数。

第二步:每个位置的路径数=它左面位置的路径数+上面位置的路径数。

第三步:不好想的是如何初始化数组。

既然只能向下或向右走,可推出最上面一排和最左面一列的所有位置上的路径只有一条。

第四步:遍历顺序是从右上角到左下角。

第五步:模拟一遍。

java 复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp=new int[m][n];//第一步:定义一个数组,表示到达该位置的路径数
        //3、初始化数组
        if(m==1 || n==1) return 1;
        for(int i=1;i<m;i++){
            dp[i][0]=1;
        }
        for(int i=1;i<n;i++){
            dp[0][i]=1;
        }
        for(int i=1;i<m;i++){//2、遍历顺序
            for(int j=1;j<n;j++){
                dp[i][j]=dp[i-1][j]+dp[i][j-1];//4、递推公式
            }
        }
        return dp[m-1][n-1];//5、举例推导

    }
}

时间复杂度:O(m × n)

空间复杂度:O(m × n)

63. 不同路径 II



思路: 和上一题思路一样,只是遇到障碍物就将当前位置设为零。注意:当在初始化时遇到障碍物,则将之后的位置都设为0,因为根本无法到达这些位置。

java 复制代码
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m=obstacleGrid.length;
        int n=obstacleGrid[0].length;
        int[][] dp=new int[m][n];
        for(int i=0;i<m;i++){
            if(obstacleGrid[i][0]==0) dp[i][0]=1;
            else break;
        }
        for(int i=0;i<n;i++){
            if(obstacleGrid[0][i]==0) dp[0][i]=1;
            else break;
        }

        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(obstacleGrid[i][j]==0){
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }else{
                    dp[i][j]=0;
                }
            }
        }
        return dp[m-1][n-1];
    }
}

时间复杂度:O(m × n)

空间复杂度:O(m × n)

相关推荐
开开心心就好2 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
80530单词突击赢15 分钟前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
Wei&Yan31 分钟前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
爬山算法34 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.1 小时前
线程和进程的关系
java·linux·jvm
是码龙不是码农1 小时前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧1 小时前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..1 小时前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
WeiXiao_Hyy1 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇1 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式