代码随想录算法训练营第40天|343. 整数拆分、96.不同的二叉搜索树
343. 整数拆分
题目链接:link
文章讲解:link
视频讲解:link
一、做题感受&第一想法
其实第一反应是回溯……但感觉每层的集合都会很繁琐
二、学习文章后收获
1.动态规划思路
-
动规五要素分析
- dp和i的定义:dp[i]指把i拆分后最大乘积(所以dp[1]、dp[0]都没有太大意义,因为0和1拆了乘积也是0)
- 递归公式:
dp[i] = max(j * (i - j) , j * dp[i - j]), 1 <= j < i - 1
(j<i-1是为什么?因为j = i-1时,dp[j-i]也就是dp[1]为0,没有意义;而 j*(i-j)也就是(i-1)*1,这和 j=1重复了,所以可以省去j = i-1的讨论!) - 初始化:dp[0] = 0,dp[1] = 0,dp[2] = 1
- 遍历顺序:从前往后
- 手算序列(略)
-
递归公式的说明:求dp[i]可分成两种情况
- 把 i 拆成 j 和 i - j 两个数,总共两个数。
- 把 i 拆成 j 和"和为 i - j 的若干个数",总共大于等于三个数。
class Solution {
public:int integerBreak(int n) {vector<int> dp(n+1,0); //dp[i]:拆分i得到的最大乘积dp[0] = 0;dp[1] = 0; //其实这俩初始化无所谓,因为没有意义dp[2] = 1; // 1*1for(int i = 3;i <= n;i++){for(int j = 1;j < i - 1;j++){dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]));}}return dp[n];}
};
2.动态规划优化
思路:for循环上的剪枝,剪枝依据是,要想找到乘积最大的拆分方式,需要让拆出来的所有数字尽可能大小相似。所以,对于太大的 j ,可以直接跳过。
故内层for的条件改为 j <= i/2:for (int j = 1; j <= i / 2; j++)
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++) { //here!dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];}
};
2.贪心思路
思路:本题也可以用贪心,每次拆成n个3,如果剩下是4,则保留4,然后相乘,但是这个结论需要数学证明其合理性!
此处没有证明,而是直接用了结论。
说明:
if(n == 2) return 1;
if(n == 3) return 2;
if(n == 4) return 4;
剩下的,拆成3的和,直到剩下4或者不足3(也就是前面是一堆3,最后剩下的值<=4即停止,作为最后一个数字)。
class Solution {
public:int integerBreak(int n) {if(n == 1 || n == 0) return 0;if(n == 2) return 1;if(n == 3) return 2;if(n == 4) return 4;int remains = n - 3,result = 3;while(remains > 4){result *= 3;remains -= 3;}result *= remains;return result;}
};
三、过程中遇到的问题
1.多个数取最大
max(a,max(b,c))
96.不同的二叉搜索树
题目链接:link
文章讲解:link
视频讲解:link
一、做题感受&第一想法
- 动规五要素分析
- dp和i的定义:dp[i]指 i 个节点的二叉搜索树共有多少种树型
- 递归公式:
dp[i] += dp[j] * dp[i-j-1], 0 <= j <= i - 1
(左子树 j 个节点,右子树 i - j - 1个节点。总树型为 左子树的树型数 乘以 右子树的树型数) - 初始化:dp[0] = 1,dp[1] = 1
- 遍历顺序:从前往后
- 手算序列(略)
class Solution {
public:int numTrees(int n) {vector<int> dp(n+1,0);dp[0] = 1;dp[1] = 1;for(int i = 2;i <= n;i++){ //dp[i]for(int j = 0;j <= i - 1;j++){ //左子树:j,右子树:i-j-1dp[i] += dp[j] * dp[i-j-1]; //递推公式}}return dp[n];}
};
相关文章:
代码随想录算法训练营第40天|343. 整数拆分、96.不同的二叉搜索树
343. 整数拆分 题目链接:link 文章讲解:link 视频讲解:link 一、做题感受&第一想法 其实第一反应是回溯……但感觉每层的集合都会很繁琐 二、学习文章后收获 1.动态规划思路 动规五要素分析 dp和i的定义:dp[i]指把i拆分后最…...

二叉树算法
递归序 每个节点都能回到3次! 相当于2执行完然后返回了代码会往下走,来到3节点 小总结: 也就是4节点先来到自己一次,不会执行if,先调用自己左边的那个函数,但是是null,直接返回。 这个函数执行完了,就会回到自己,调用自己右边的那个函数,结果又是空,又返回,回到…...
【2024年5月备考新增】《软考真题分章练习(答案解析) - 4 项目范围管理(高项)》
点击跳转无答案版 1、() includes the processes required to ensure that the project includes all the work required , and only the work required , to complete the project successfully . Managing the project scope is primarily concerned with defining and con…...

Docker拉取镜像存储不足
在使用Docker时,我们经常遇到一个问题,就是拉取镜像时提示存储空间不足。这是因为Docker在拉取镜像时需要将镜像文件下载到本地存储中,而有时本地存储空间不足以容纳完整的镜像文件。 本文将介绍一些解决这个问题的方法,并提供相…...
JUNIT5+Mockito单元测试
文章目录 1、前言2、Maven依赖2.1 JDK21SpringBoot版本基于3.1.02.2 JDK17SpringBoot版本基于2.2.5.RELEASE 3、业务代码4、单元测试 1、前言 之前写过一篇使用testMe自动生成单元测试用例,使用的是junit4来编写的单元测试用例,目前很多新项目都已经使用…...

【C#】【SAP2000】读取SAP2000中所有Frame对象的应力比到Grasshopper中
if (build true) {// 连接到正在运行的 SAP2000// 使用 System.Runtime.InteropServices.Marshal.GetActiveObject 方法获取正在运行的 SAP2000 实例cOAPI mySapObject (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject"…...

一台服务器部署两个独立的mysql实例
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…...

SpringBoot(Lombok + Spring Initailizr + yaml)
1.Lombok 1.基本介绍 2.应用实例 1.pom.xml 引入Lombok,使用版本仲裁 <!--导入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version&g…...

数据库基础知识超详细解析~(进阶/复习版)
文章目录 前言一、数据库的操作1.登入数据库2.创建数据库3.显示当前数据库4.使用数据库5.删除数据库 二、常用数据类型三、数据库的约束1约束类型2NULL约束3UNIQUE:唯一约束4DEFAULT:默认值约束5 PRIMARY KEY:主键约束6 FOREIGN KEY:外键约束…...
创建对象的方法有哪些
创建对象的方法主要取决于你使用的编程语言和上下文。下面我将列出一些主流编程语言中创建对象的方法: Python: 使用类定义和__init__方法: pythonclass MyClass: def __init__(self, name): self.name nameobj MyClass("Alice") 1.使用工厂…...
Oracle 10g字符编码
pl/sql developer查询数据时出现乱码,主要检查如下: 1、检查服务器编码 select * from v$nls_parameters;select * from nls_database_parameters;select userenv(language) from dual; 2、查看数据库可用字符集参数设置 select * from v$nls_valid_val…...

掌握抽象基础之20个必备原则,看完你还不会,你打我
抽象基础之20个必备原则 1. 面向对象编程(OOP)中抽象原则背后的基本思想是什么?2.抽象和封装的区别?3.提供一个现实生活中说明抽象的例子4.在编程语言中如何实现抽象?5.定义抽象类6.提供一个抽象类的真实世界场景7.解释…...

设计模式 -- 2:策略模式
目录 总结部分:策略模式的优点部分代码部分 总结部分: 策略模式和简单工厂模式很像 区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案 而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相…...

【快速上手ProtoBuf】proto 3 语法详解
1 🍑字段规则🍑 消息的字段可以⽤下⾯⼏种规则来修饰: singular :消息中可以包含该字段零次或⼀次(不超过⼀次)。 proto3 语法中,字段默认使⽤该规则。repeated :消息中可以包含该…...

人工智能的幽默“失误”
人工智能迷惑行为大赏 随着ChatGPT热度的攀升,越来越多的公司也相继推出了自己的AI大模型,如文心一言、通义千问等。各大应用也开始内置AI玩法,如抖音的AI特效~在使用过程中往往会遇到一些问题,让你不得不怀疑&#x…...
js的异步请求?
在 JavaScript 中,进行异步请求通常涉及到使用 XMLHttpRequest 对象或者更现代的 Fetch API 或 Axios 库。这些工具可以帮助我们向服务器发送请求并在后台获取数据,而不会阻塞页面的其他操作。 下面是一个简单的示例,演示如何使用原生的 XML…...
华润对象存储(OBS)工具类
目录 一、备注二、工具类三、对象存储放在内网,如何实现外网访问 一、备注 1、ObjectBasicInfo、ObjectDetailInfo、ResultBody这三个类可自行替换或者去掉 二、工具类 package com.xxx.util;import com.amazonaws.HttpMethod; import com.amazonaws.auth.AWSStat…...
强缓存和协商缓存的区别?
协商缓存和强缓存是 HTTP 缓存机制中的两种不同的策略,用于减少网络请求并提高网页加载速度。它们之间的主要区别在于缓存的验证方式和服务器返回的响应头。 强缓存: 强缓存是基于过期时间(Expires)和缓存标识(Cache…...

ChatGPT提问技巧——对抗性提示
ChatGPT提问技巧——对抗性提示 对抗性提示是一种允许模型生成能够抵御某些类型的攻击或偏差的文本的技术。这种技术可用于训练更健壮、更能抵御某些类型的攻击或偏差的模型。 要在 ChatGPT 中使用对抗性提示,应为模型提供一个提示,该提示的设计应使模…...

openGauss使用BenchmarkSQL进行性能测试(上)
一、前言 本文提供openGauss使用BenchmarkSQL进行性能测试的方法和测试数据报告。 BenchmarkSQL,一个JDBC基准测试工具,内嵌了TPC-C测试脚本,支持很多数据库,如PostgreSQL、Oracle和Mysql等。 TPC-C是专门针对联机交易处理系统…...

PVE 虚拟机安装 Ubuntu Server V24 系统 —— 一步一步安装配置基于 Ubuntu Server 的 NodeJS 服务器详细实录1
前言 最近在基于 NodeJS V22 写一个全栈的项目,写好了,当然需要配置服务器部署啦。这个过程对于熟手来说,还是不复杂的,但是对于很多新手来说,可能稍微有点困难。所以,我把整个过程全部记录一下。 熟悉我…...
蓝牙防丢器应用方案
蓝牙防丢器通常由两个主要部分构成:一个小型装置,亦称为标签,以及一个与之配对的手机应用程序。该标签内置一个微型蓝牙芯片,能够与配对的手机应用程序进行通信。一旦标签与手机之间的连接中断,手机应用程序便会接收到…...
匀速旋转动画的终极对决:requestAnimationFrame vs CSS Animation
引言:旋转动画的隐藏陷阱 在现代Web开发中,实现一个流畅的无限旋转动画似乎是个简单任务。但当我深入探究时,发现这个看似基础的需求背后隐藏着性能陷阱、数学精度问题和浏览器渲染机制的深层奥秘。本文将带你从一段常见的requestAnimationF…...

【Kotlin】简介变量类接口
【Kotlin】简介&变量&类&接口 【Kotlin】数字&字符串&数组&集合 【Kotlin】高阶函数&Lambda&内联函数 【Kotlin】表达式&关键字 文章目录 Kotlin_简介&变量&类&接口Kotlin的特性Kotlin优势创建Kotlin项目变量变量保存了指向对…...
mybatis 参数绑定错误示范(1)
采用xml形式的mybatis 错误示例: server伪代码为: Map<String, Object> findMapNew MapUtil.<String, Object>builder().put("applyUnit", appUnit).put("planYear", year ! null ? year : -1).put("code&quo…...
【使用】【经验】docker 清理未使用的镜像的命令
docker images prune在 Docker 中清理未使用的镜像(包括悬空镜像和完全未被引用的镜像),可以使用以下命令: 1. 删除所有悬空镜像(推荐常用) docker image prune悬空镜像 (dangling images) 是指…...

英国2025年战略防御评估报告:网络与电磁域成现代战争核心
英国 2025 年战略防御评估 (SDR) 详细制定了一项计划,通过加强使用网络、人工智能和数字战争来整合其军事防御和进攻能力。 与美国一样,英国也被认为(尽管未被公开证实)会开展进攻性网络行动,甚至针对盟友。斯诺登泄露…...

SAP学习笔记 - 开发15 - 前端Fiori开发 Boostrap,Controls,MVC(Model,View,Controller),Modules
上一章讲了Fiori开发的准备,以及宇宙至简之HelloWorld。 SAP学习笔记 - 开发14 - 前端Fiori开发 HelloWorld-CSDN博客 本章继续学习 Fiori 开发的知识: Bootstrap,Controls,MVC(Model,View,Controller&a…...

Python爬虫(48)基于Scrapy-Redis与深度强化学习的智能分布式爬虫架构设计与实践
目录 一、背景与行业痛点二、核心技术架构设计2.1 分布式爬虫基础架构2.2 深度强化学习模块 三、生产环境实践案例3.1 电商价格监控系统3.2 学术文献采集系统 四、高级优化技术4.1 联邦学习增强4.2 神经架构搜索(NAS) 五、总结🌈Python爬虫相…...
数据库操作-MySQL-4(JDBC编程)
JDBC:通过Java代码操作mysql数据库,数据库会提供一些API供我们调用 MySQL、Oracle、等API有差异,但是Java统一了所有接口,即JDBC; 原始api-驱动包(类似转接头)-统一的api-Java 驱动包࿱…...