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

文章目录

    • Leetcode 343. 整数拆分
    • Leetcode 96.不同的二叉搜索树

Leetcode 343. 整数拆分

题目链接:Leetcode 343. 整数拆分
题目描述: 给定一个正整数 n ,将其拆分为 k 个 正整数的和( k >= 2 ),并使这些整数的乘积最大化。返回你可以获得的最大乘积
思路: 本题需要拆分一个整数,我们发现当n >= 2的时候,至少能拆出两个小整数,我们可以继续拆分这两个小整数,也可以不拆,由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。

  • 定义dp[i]:数字i,可以得到的最大乘积为dp[i]
  • 求解dp[i]dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j))
    不过这个递推表达式是怎么得出来的呢?由于n >= 2的时候,至少能拆出两个小整数,以此为切入点,我们可以分为两种情况:继续拆或者不继续拆,根据dp[i]数组定义可以写出max((i - j) * j, dp[i - j] * j)的表达式,由于我们不知道最大的乘积何时出现,因此需要多次取最大值,最终保存最大乘积。
  • 初始化:由于01无法拆分,因此dp[0]=dp[1]=0,而dp[2]=1
  • 结果:dp[n]

代码如下:(动态规划)

class Solution {
public:int integerBreak(int n) {//vector<int> dp(n + 1);int dp[60]={0};//初始化dp[0]和dp[1]无意义dp[2] = 1;for (int i = 3; i <= n; i++)         //依次求出dp[i]for (int j = 1; j <= i / 2; j++) //每次拆分的值为j//由于超过i/2之后拆分的两个数字前面已经计算过(只是交换顺序),因此可以跳过dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));return dp[n];}
};
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

除此之外还有一种数学方法:(看题解发现的,推导过程都是高中知识,不难理解但是想不到:利用不等式和求导来降低时间和空间复杂度)
代码如下:(数学)

class Solution {
public:int integerBreak(int n) {if (n <= 3)return n - 1;int a = n / 3, b = n % 3;if (b == 0)return pow(3, a);else if (b == 1)return pow(3, a - 1) * 4;else//(b==2)return pow(3, a) * 2;}
};
  • 时间复杂度 O ( 1 ) O(1) O(1) : 仅有求整、求余、次方运算。

  • 空间复杂度 O ( 1 ) O(1) O(1)ab 使用常数大小额外空间。

Leetcode 96.不同的二叉搜索树

题目链接:Leetcode 96.不同的二叉搜索树
题目描述: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的二叉搜索树 有多少种?返回满足题意的二叉搜索树的种类数
思路: 对于n个节点,以i为根节点组成的二叉搜索树的种类数等于其左右子树所能组成的种类数之和。

  • 定义dp[i]1i为节点组成的二叉搜索树的个数为dp[i]
  • 求解dp[i]dp[i] += dp[j - 1] * dp[i - j]j-1j为头结点左子树节点数量i-j 为以j为头结点右子树节点数量
  • 初始化:dp[0]=1从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树
  • 结果:dp[n]

代码如下:

class Solution {
public:int numTrees(int n) {vector<int> dp(n + 5);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];}
};
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

总结: 算法的尽头也是数学啊!

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

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

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

相关文章

仿12306校招项目业务四(乘车人模块)

乘车人表结构 分库分表策略 乘车人的数据严重依赖于用户数据。每个用户至少需要有一个对应的乘车人&#xff0c;即自己本人。当然&#xff0c;也有可能是其他人&#xff0c;因为允许用户注册账号后为他人购票的情况。这种关联确保了用户和乘车人之间的正确映射&#xff0c;使系…

LeetCode | 两数相加 C语言

Problem: 2. 两数相加 文章目录 思路解题方法Code一些感想 思路 主要是一一相加和逆序的方式存储 先说逆序储存&#xff0c;看下图 我们先声明出指针p和指针q&#xff0c;还有指针head&#xff08;主要用于return上而已&#xff09;&#xff0c;然后进行一系列操作&#xff0c…

从源码学习单例模式

单例模式 单例模式是一种设计模式&#xff0c;常用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这意味着无论在程序的哪个地方&#xff0c;只能创建一个该类的实例&#xff0c;而不会出现多个相同实例的情况。 在单例模式中&#xff0c;常用的实现方式包括懒汉…

c++中模板的注意事项

1. 模板定义时&#xff0c;<>中的虚拟类型参数不能为空。(因为我们使用模板就是希望使用模拟类型代替其它的类型&#xff0c;如果我们不定义就没有意义了) 2. 无论是定义函数模板还是类模板&#xff0c;其实template定义与后面使用虚拟类型的类或者函数&#xff0c;是…

【论文精读】DALL·E2

摘要 CLIP被证明其可以学习到鲁棒的图像特征&#xff0c;可以有效的捕获图像的语义和风格&#xff0c;且具有很强的zero-shot能力。另外&#xff0c;Diffusion是目前最优的生成式框架&#xff0c;其推动了图像、视频生成任务的最先进性能。Classifier-Free Diffusion指导技术以…

汽车大灯尾灯灯罩裂了可以修复吗?汽车大灯尾灯裂缝修复用什么胶?拆开的灯罩用什么胶合壳密封?

随着科学技术的不断发展&#xff0c;汽车大灯尾灯破损是可以修的。 TADHE车灯无痕修复专用UV胶是一种经过处理的UV树脂胶&#xff0c;主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 其具备环氧树脂胶优点的同时&#xff0c;还有如下特点&#xff1a; 固化时间…

R语言入门笔记2.5

数据预处理 R语言处理的数据多以数据框的形式出现。 预备操作 数据查看 > dim(x) [1] 16 3 #数据框有16行3列 > names(x) #查看数据框的变量名 [1] "X" "Z" "Y" > head(x,3) #查看前3行&#xff0c;若为-3则是查看后三行之…

Vue模板引用之ref特殊属性

1. 使用实例 <template><input ref"input" name"我是input的name" /><br /><ul><li v-for"arr in array" :key"arr" id"111" ref"itemRefs">{{arr}}</li></ul> </…

【蓝桥杯省赛真题28】python输出字符串 中小学青少年组蓝桥杯比赛python编程省赛真题解析

目录 python输出字符串 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python输出字符串 第十二届蓝桥杯青少年组python比赛选拔赛真题 一、题…

IDA使用-2023CICSN华中赛区pwn题逆向为例

文章目录 相关字节标识导入函数和导出函数找程序入口函数选项设置重命名CISCN2023华中赛区分区赛AWDIDA源码main 构造结构体sub_141B() 打开局部变量类型的视图增加变量类型重新定义变量类型再次设置变量类型并重新定义再次设置变量类型并重新定义再次设置变量类型并重新定义 设…

JavaSE-04笔记【面向对象01】

文章目录 1. final 关键字1.1 采用final修饰的类不能被继承1.2 采用 final 修饰的方法不能被覆盖1.3 采用 final 修饰的变量(基本类型)不能被修改1.4 采用final 修饰的变量必须显示初始化1.5 如果修饰的引用&#xff0c;那么这个引用只能指向一个对象&#xff0c;也就是说这个引…

第十一届蓝桥杯省赛第一场C++ B组《整除序列》(c++)

1.题目说明 有一个序列&#xff0c;序列的第一个数是 n&#xff0c;后面的每个数是前一个数整除 2&#xff0c;请输出这个序列中值为正数的项。 2.输入格式 输入一行包含一个整数 n。 3.输出格式 输出一行&#xff0c;包含多个整数&#xff0c;相邻的整数之间用一个空格分…

Java的垃圾回收机制

Java的垃圾回收机制是一种自动内存管理机制&#xff0c;它负责在程序运行过程中自动回收不再使用的内存空间&#xff0c;以避免内存泄漏和提高程序的性能。 Java的垃圾回收机制主要基于以下两个原则&#xff1a; 1. 引用计数&#xff1a;每个对象都有一个引用计数器&#xff0…

云原生之容器编排实践-kubectl get pod -A没有coredns

背景 前面搭建的3节点 Kubernetes 集群&#xff0c;其实少了一个组件&#xff1a; CoreDNS &#xff0c;这也是我后面拿 ruoyi-cloud 项目练手时&#xff0c;部署了 MySQL 和 Nacos 服务后才意识到的&#xff1a;发现Nacos无法通过服务名连接MySQL&#xff0c;这里 Nacos 选择…

MySQL-主从复制

目录 1. 主从复制概述 1.1 如何提升数据库并发能力 1.2 主从复制的作用 2. 主从复制的原理 2.1 原理剖析 三个线程 复制三步骤 复制的问题 2.2 复制的基本原则 3. 一主一从架构搭建 3.1 准备工作 3.2 主机配置文件 3.3 从机配置文件 3.4 主机&#xff1a;建立账户…

Vue packages version mismatch 报错解决

问题 npm run dev 运行项目的过程中&#xff0c;报错 Vue packages version mismatch 解决方法 根据报错不难看出是 vue 与 vue-template-compiler 版本产生了冲突&#xff0c;vue 与 vue-template-compiler 的版本是需要匹配的。所以解决的办法就是先修改其中一个的版本将 v…

Programming Abstractions in C阅读笔记:p293-p302

《Programming Abstractions in C》学习第73天&#xff0c;p293-p302总结&#xff0c;总计10页。 一、技术总结 1.时间复杂度 (1)quadratic time(二次时间) p293, Algorithms like selection sort that exhibit O(N^2) performance are said to run in quadratic time。 2…

如何利用EXCEL批量插入图片

目录 1.excel打开目标表格&#xff1b; 2.点开视图-宏-录制宏&#xff0c;可以改宏的名字或者选择默认&#xff1b; 3.然后点开视图-宏-查看宏 4.点编辑进去 5.修改代码&#xff1a; &#xff08;1&#xff09;打开之后会显示有一堆代码 &#xff08;2&#xff09;将这个…

记录 | go与C/C++交互

Go语言是类C的语言&#xff0c;与C语言有着千丝万缕的联系&#xff0c;在Go语言的代码中可以直接调用C语言代码&#xff0c;但不支持直接调用 C。 Go 调用 C/C 的方式&#xff1a; C&#xff1a;直接调用 C API&#xff1b;C&#xff1a;通过实现一层封装的 C 接口来调用 C 接…

Django入门指南:从环境搭建到模型管理系统的完整教程

环境安装&#xff1a; ​ 由于我的C的Anaconda 是安装在C盘的&#xff0c;但是没内存了&#xff0c;所有我将环境转在e盘&#xff0c;下面的命令是创建环境到指定目录中. conda create --prefixE:\envs\dj42 python3.9进入环境中&#xff1a; conda activate E:\envs\dj42…