代码随想录训练营第41天|LeetCode 343. 整数拆分、 96.不同的二叉搜索树

news2024/11/19 21:29:18

参考

代码随想录

题目一:LeetCode 343.整数拆分

  1. 确定dp数组及其下标的含义
    dp[i]为整数i拆分后得到的最大化乘积。
  2. 确定递推公式
    dp[i]可以有两种方式得到:
  • dp[i] = j * (i-j),即只拆分成两个数,其中1 <= j <= i/2,最终dp[i]应该是所有j取值得到dp[i]中的最大值
  • dp[i] = j * dp[i-j],这种情况相当于将整数i拆分成多个数,因为其中的dp[i-j]已经被拆分过了,至少被拆分成两个数,具体拆分成多少个数不用去管,其中1 <= j <= i/2,同样dp[i]也是所有取值中的最大值。

在具体的代码实现上,dp[i] = max(dp[i],j * (i - j),j * dp[i - j]),这样对于每个i,只需要遍历一遍j就可以得到dp[i]了。把dp[i]放到max函数中的目的就是不断更新最大值。

  1. 初始化dp数组
    i = 0或1时,dp[i]是用不到的,所以不需要初始化只需要将dp[2]初始化为1,即dp[2] = 1

  2. 确定遍历顺序
    对于i,dp[i]需要由dp[i-j]来确定,所以i应该从小到大遍历;对于j,既可以从大到小也可以从小到大。

  3. 举例推导dp数组
    以n = 10为例,根据下面的递推公式进行推导:

dp[i] = max(dp[i],j * (i - j),j * dp[i - j]),其中3 <= i <= 10,1 <= j <= i/2

推导得到的dp数组为[1,2,4,6,9,12,18,27,36](注意下标从2开始),因此dp[10] = 36。

具体的代码实现如下:

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1);
        dp[2] = 1;
        for(int i = 3; i <= n; i++)
            for(int j = 1; j <= i/2; j++)
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
        return dp[n];
    }
};

题目二:LeetCode 96.不同的二叉搜索树

在这里插入图片描述
在这里插入图片描述
感觉这个题更像是找规律的题目,但是这个规律很难看出来。
dp[3]就是元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量

元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

有2个元素的搜索树数量就是dp[2]。

有1个元素的搜索树数量就是dp[1]。

有0个元素的搜索树数量就是dp[0]。

所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]

  1. 确定dp数组(dp table)以及下标的含义
    dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。
  2. 确定递推公式
    dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量
  3. dp数组如何初始化
    初始化,只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。根据递推公式,dp[0] = 1.
  4. 确定遍历顺序
    首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。那么遍历i里面每一个数作为头结点的状态,用j来遍历。
  5. 举例推导dp数组
    当 n = 5时,dp数组为[1,1,2,5,14,42]

整体代码实现如下:

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n + 1);
        dp[0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx的高可用集群

1、什么是 nginx高可用 只有一台nginx服务器时&#xff0c;如果nginx服务器宕机了&#xff0c;那么请求就无法访问。 要实现高可用&#xff0c;那就可以部署多台nginx服务器&#xff0c;下面以两台nginx服务器为例&#xff0c;示意图如下&#xff1a; 要配置nginx集群&#xf…

西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第22期目录

百年党建与马克思主义中国化研究 党的纪律建设的实践、启示与创新——基于“三大纪律八项注意”的研究 武艳; 5-8 西部研究《西部学刊》投稿&#xff1a;cn7kantougao163.com 新疆红色资源运用现状调查研究——以南疆部分地区为例 王艺潼;努尔古扎丽阿不都克里木; 9-12…

BP神经网络对指纹识别的应用(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在现代计算机具有强大的计算和信息处理能力的今天,指纹识别作为个人身份鉴定等领域的热点问题一直被人们长期关注着,目前也得到…

版本控制 | 一文了解什么是组件化开发,以及如何从单体架构转向组件化开发

传统开发模式中&#xff0c;所有代码都写在APP模块中。随着项目的发展&#xff0c;代码量逐渐庞大&#xff0c;编译时间越来越长。为了方便后续项目的开发和测试、提高编译性能&#xff0c;您需要了解组件化开发&#xff0c;以及如何利用版本控制系统从单体架构转向组件化开发。…

【Python自然语言处理】使用SVM、随机森林法、梯度法等多种方法对病人罹患癌症预测实战(超详细 附源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、数据集背景 乳腺癌数据集是由加州大学欧文分校维护的 UCI 机器学习存储库。 数据集包含 569 个恶性和良性肿瘤细胞样本。 样本类别分布&#xff1a;良性357&#xff0c;恶性212 数据集中的前两列分别存储样本的唯一 …

Prototypical Networks for Few-shot Learning

摘要 我们为零样本分类问题提出了一个原型网络。在这里分类器必须能够被泛化到新类别&#xff08;在训练集中不可见&#xff09;&#xff0c;每个新类只给出少量示例。 原型网络能够学习一个度量空间&#xff0c;通过计算每个类别的原型表示距离实现分类。与少样本学习近几年的…

华为机试 - 完全二叉树非叶子部分后序遍历

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一个以顺序储存结构存储整数值的完全二叉树序列&#xff08;最多1000个整数&#xff09;&#xff0c;请找出此完全二叉树的所有非叶子节点部分&#xff0c;然后采用后序遍历方式将此部分树&#x…

AOP事务管理(下)

Transactional注解可以设置参数。 readOnly&#xff1a;true只读事务&#xff0c;false读写事务&#xff0c;增删改要设为false,查询设为true。 timeout:设置超时时间单位秒&#xff0c;在多长时间之内事务没有提交成功就自动回滚&#xff0c;-1表示不设置超 时时间。 rollbac…

熬夜也要肝完的阿里内部面试官手册,吃透直接拿下大厂心仪 offer

前言 蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#…

ASP.NET通用版权限管理系统源码分享

ASP.NET通用版权限管理系统源码 源码分享&#xff01;需要源码学习可私信我。 主要功能有&#xff1a;权限管理、角色管理、部门管理、用户管理、公司管理、模块管理、系统设置。 一、 权限管理 以关键字&#xff08;Key&#xff09;的方式来定义系统的权限&#xff0c;使系统…

(附源码)springboot农田灌溉设备管理系统 毕业设计 260931

题 目 springboot 农田灌溉设备管理系统 目 录 摘要 1 1 绪论 1 1.1选题的目的和意义 1 1.2研究现状 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2 农田灌溉设备管理系统 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据增加流程 3 2.3.2数据修改流程…

强的离谱!阿里人用五个模块讲明白了SpringCloud,已开源!

微服务 作为一名Java程序员如果你对微服务不了解&#xff0c;就会在学习或者使用的过程中觉得有点“晕”。微服务是一种面向服务的软件架构模式&#xff01; 我们常说&#xff0c;架构设计的核心是满足降本增效。该怎么理解&#xff1f; 举个例子&#xff0c;微服务架构之所…

简单学校网页设计作业 静态HTML校园博客主页 DW大学网站模板下载 大学生简单我的学校网页作品代码 个人网页制作 学生个人网页设计作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]计算机毕业设计JAVA疫苗接种管理系统

[附源码]计算机毕业设计JAVA疫苗接种管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

AIGC的一些材料

概念和前景 先看亚马逊AWS给AIGC的定义。 AIGC 是什么_亚马逊云科技 AIGC 解决方案 它有多个模态分支&#xff0c;但大同小异。 Diffusion预训练成本降低6.5倍&#xff0c;微调硬件成本降低7倍&#xff01;Colossal-AI完整开源方案低成本加速AIGC产业落地 背景 1.01亿美元融资…

Java项目:SSM电器商城系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录…

低功耗局域网通信硬件之lora——sx1262-sx1276硬件设计开发

1.lora简介 LoRa是semtech公司开发的一种低功耗局域网无线标准&#xff0c;其名称“LoRa”是远距离无线电&#xff08;Long Range Radio&#xff09;&#xff0c;它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远&#xff0c;实现了低功耗和远距离的统一&#x…

浅谈ES标准的演变

ECMAScript从1997年第一版诞生依赖&#xff0c;经过无数人的“踩坑”和“填坑”&#xff0c;到现在&#xff0c;ES12呼之欲出。那么我们不妨讨论一下ES的发展历程&#xff0c;看它如何统一江湖&#xff0c;看它“曲折”而又令人期待的发展之路。 最近分析typescript&#xff0c…

双机互备是什么意思?双机互备就是双机热备吗?

看到不少小伙伴在问&#xff0c;双机互备是什么意思&#xff1f;双机互备就是双机热备吗&#xff1f;今天我们就来一起简单了解了解吧&#xff01; 双机互备是什么意思&#xff1f;双机互备就是双机热备吗&#xff1f; 双机互备是指在双机热备的基础上&#xff0c;两个相对独…

【AI数学】余弦相似性(含python实现)

Cosine Similarity&#xff0c;即余弦相似度&#xff0c;又叫余弦相似性。是一个中学数学的概念&#xff0c;即用两个向量之间的夹角余弦值代表这两个向量之间的相似度。 Cosine Similarity虽然简单&#xff0c;但广泛应用在AI模型中&#xff0c;比如CLIP计算图像embedding和文…