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

代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树

代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树

62.不同路径

动态规划第二集:

比较标准简单的一道动态规划,状态转移方程容易想到

难点在于空间复杂度的优化,详见代码

class Solution {
    public int uniquePaths(int m, int n) {
        // 标准的动态规划
        int[][] dp = new int[m + 1][n + 1];
        // 初始化时多加了一行一列,方便初始化
        dp[1][0] = 1;
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[0].length; j++) {
                // 状态转移方程
                dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
            }
        }
        return dp[m][n];
    }
}

class Solution {
    public int uniquePaths(int m, int n) {
        // 标准的动态规划,空间优化版
        int[] dp = new int[n + 1];
        dp[1] = 1;
        for (int i = 1; i <= m; i++) {
            for (int j = 2; j <= n; j++) {
                // 状态转移方程
                // 只需要第 i 行与第 i-1 行的数据
                // dp[j - 1]已更新,是第 i 行的数据
                // dp[j]未更新,是第 i-1 行的数据
                dp[j] = dp[j - 1] + dp[j];
            }
        }
        return dp[n];
    }
}

63.不同路径II

相比上题只多了一个障碍的判断

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        // 空间优化思路同62题
        int[] dp = new int[n + 1];
        dp[1] = 1;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 处理障碍情况
                if (obstacleGrid[i - 1][j - 1] == 1)
                    dp[j] = 0;
                // 状态转移方程
                else dp[j] = dp[j - 1] + dp[j];
            }
        }
        return dp[n];
    }
}

343.整数拆分

动态规划问题,相对简单,想清楚状态转移方程就好,详见代码注释

class Solution {
    public int integerBreak(int n) {
        // dp[i] 的定义是 对 i 进行划分后的最大乘积
        int[] dp = new int[n + 1];
        dp[2] = 1;
        // 动态规划
        for (int i = 3; i <= n; i++) {
            // 循环进行划分
            for (int j = 1; j <= i / 2; j++) {
                // 状态转移方程
                // j * dp[i - j] 相当于是 在 i-j 中进行了多次划分
                // j * (i - j) 是只划分一次
                dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)));
            }
        }
        return dp[n];
    }
}

96.不同的二叉搜索树

动态规划:

要注意到,二叉树种类数目 = 左子树种类数目 * 右子树种类数目

class Solution {
    public int numTrees(int n) {
        // dp[i]定义为 i个节点时,互不相同的BST的种类数
        int[] dp = new int[n + 1];
        // 初始化:0个节点时只有一种
        dp[0] = 1;
        for (int i = 1; i <= n ; i++) {
            // 循环选择根节点为 j
            for (int j = 1; j <= i; j++) {
                // dp[j - 1]为左子树种类数,dp[i - j]为右子树种类数
                // 左右数目相乘即为根节点为 j 时的种类数
                // 累加到 dp[i] 上
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
}

http://www.kler.cn/a/503533.html

相关文章:

  • 【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)
  • Leetcode 377. 组合总和 Ⅳ 动态规划
  • 20250112面试鸭特训营第20天
  • MATLAB学习笔记目录
  • 【Uniapp-Vue3】页面生命周期onLoad和onReady
  • RCE漏洞
  • 算法-查找数组对角线上最大的质数
  • 【IDEA 2024】学习笔记--文件选项卡
  • 我的年度总结
  • 高级运维:shell练习2
  • 【后端面试总结】tls中.crt和.key的关系
  • (EACL-2023)DyLoRA:使用动态无搜索低秩自适应对预训练模型进行参数高效调整
  • Springboot + vue 小区物业管理系统
  • OpenCV实现多尺度细节提升算法
  • Kafka消费者如何优雅下线
  • RTK北斗高精度定位4G执法记录仪在铁路作业安全风险管控中的应用
  • 【kubernetes】K8S节点状态的维护
  • C++并发编程之普通无锁队列与单生成者单消费者队列
  • 数据结构与算法之栈: LeetCode 151. 反转字符串中的单词 (Ts版)
  • 概率论考前一天
  • Elasticsearch面试题总结
  • Linux Kernel 之十 详解 PREEMPT_RT、Xenomai 的架构、源码、构建及使用
  • 高级运维:源码编译安装httpd 2.4,提供系统服务管理脚本并测试
  • 【华为OD-E卷 - 猜数字 100分(python、java、c++、js、c)】
  • 代码随想录算法训练营第十二天|第18题. 四数之和
  • golang之数据库操作