当前位置: 首页 > news >正文

代码随想录算法训练营第34天 | 62.不同路径 63. 不同路径 II 整数拆分 不同的二叉搜索树 (跳过)

62.不同路径

62. 不同路径 - 力扣(LeetCode)

本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。

代码随想录

视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili

dp数组含义:从m*n格子左上角到右上角有几种走法

递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];

初始化:dp[i][1] = 1  dp[1][i] = 1 

遍历顺序:从左往右

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m + 1][n + 1];
        for(int i = 1;i < m + 1;i++){
            dp[i][1] = 1;
        }
        for(int i = 1;i < n + 1;i++){
            dp[1][i] = 1;
        }
        for(int i = 2;i < m + 1;i++){
            for(int j = 2;j < n + 1;j++){
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m][n];
    }
}

63. 不同路径 II

63. 不同路径 II - 力扣(LeetCode)

https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html

视频讲解:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

dp数组含义:从当前位置到目标位置有几种走法

递归公式:dp[i][j] = dp[i + 1][j] + dp[i][j + 1];

初始化:n - 1列 m - 1行,从左向右从上到下找到最后一个出现的障碍,障碍和之前的dp都是0

其他位置如果有障碍,dp也是0

遍历顺序:从右向左,从下到上

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        int mem = -1;
        //初始化n - 1列
       for(int i = 0;i < m;i++){
            if(obstacleGrid[i][n - 1] == 1){
                mem = i;
                dp[i][n - 1] = 0;
            }
            else{
                dp[i][n - 1] = 1;
            }
       }
       if(mem != -1){
            for(int i = 0;i < mem;i++){
            dp[i][n - 1] = 0;
            }
       }
       
        mem = -1;
        //初始化m - 1行
       for(int i = 0;i < n;i++){
            if(obstacleGrid[m - 1][i] == 1){
                mem = i;
                dp[m - 1][i] = 0;
            }
            else{
                dp[m - 1][i] = 1;
            }
       }
       if(mem != -1){
            for(int i = 0;i < mem;i++){
            dp[m - 1][i] = 0;
            }
       }
        
       for(int i = m - 2;i >= 0;i--){
            for(int j = n - 2;j >= 0;j--){
                //碰到障碍就是0种走法
                if(obstacleGrid[i][j] == 1)dp[i][j] = 0;
                //从右向左遍历
                else dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
            }
       }
       return dp[0][0];
    }
}

随想录的,dp的含义是从00到该目标位置有几种走法,从左向右遍历

初始化第一行第一列,没有障碍物赋1,只要遇到一个障碍物就赋0,后面都是0

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];

        //如果在起点或终点出现了障碍,直接返回0
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
            return 0;
        }

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

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
            }
        }
        return dp[m - 1][n - 1];
    }
}
  1. 整数拆分 

343. 整数拆分 - 力扣(LeetCode)

代码随想录

视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili

class Solution {
    public int integerBreak(int n) {
        if(n == 2)return 1;
        int[] dp = new int[n + 1];
        dp[2] = 1;
        dp[3] = 2;
        int temp = 0;
        for(int i = 3;i < n + 1;i++){
            for(int j = 1;j <= i/2;j++){
                dp[i] = Math.max(j * dp[i - j],j*(i - j));
                dp[i] = Math.max(dp[i],temp);
                temp = dp[i];
            }
        }
        return dp[n];
    }
}
  1. 不同的二叉搜索树 (跳过)

本题思路并不容易想,一刷建议可以跳过。 如果学有余力,可以看视频理解一波。

代码随想录

视频讲解:动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树_哔哩哔哩_bilibili

相关文章:

  • linux(centos8)下编译ffmpeg
  • HCIA-PPP
  • 每天五分钟深度学习PyTorch:循环神经网络RNN的计算以及维度信息
  • 大数据 Spark 技术简介
  • TLSR8355F128芯片特色解析
  • Linux中的epoll简单使用案例
  • 视频转音频, 音频转文字
  • 通过socket实现文件上传和下载功能
  • 信息系统运行管理员教程5--信息系统数据资源维护
  • PAT甲级(Advanced Level) Practice 1023 Have Fun with Numbers
  • LeetCode 1005. K 次取反后最大化的数组和 java题解
  • C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷二)
  • SpringBoot3+Druid+MybatisPlus多数据源支持,通过@DS注解配置Service/Mapper/Entity使用什么数据源
  • Windows11 新机开荒(二)电脑优化设置
  • C++ 类和对象 友元 内部类 this指针 默认成员函数 初始化列表……
  • Pandas DataFrame:数据分析的利器
  • 14 结构体
  • WebSocket和长轮询
  • 【操作系统】Ch6 文件系统
  • 【最后203篇系列】015 几种消息队列的思考
  • 央媒评网红质疑胖东来玉石定价暴利:对碰瓷式维权不能姑息
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 铁路部门:确保沿线群众安全,焦柳铁路6个区段将陆续安装防护栅栏
  • 美国三大指数全线高开:纳指涨逾4%,大型科技股、中概股大涨
  • 秦洪看盘|预期改善,或迎来新的增量资金
  • 他站在当代思想的地平线上,眺望浪漫主义的余晖