第四十天| 343. 整数拆分、96.不同的二叉搜索树

news2024/12/23 6:33:52

Leetcode 343. 整数拆分

题目链接:343 整数拆分

题干:给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。

思考:动态规划。本题难点在于值n要拆分成几个数乘积最大。

  • 确定dp数组(dp table)以及下标的含义

dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。

  • 确定递推公式

首先可以将 i 拆分成两个数相乘,只要  j 从1开始遍历至 i - 1作乘数之一,另一个乘数即为 i - j。

考虑dp[i]的定义,dp[i]是 i 拆分成多个乘数得到的最大乘积。 

因此可以将 i 拆分成多个数相乘,其中一个乘数仍为 j , 另外多个乘数的最大乘积为 dp[i - j]。

取上面两种相乘结果的最大值。所以递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));


如果仅考虑将 i 拆分为多个数相乘(包括两个),则递推公式:dp[i] = max({dp[i],  dp[i - j] * dp[j]});

而这种拆法默认将一个数拆成4份以及4份以上,但例如10,最大乘积是拆分成3,3,4得到的。

因此不能统一处理,要分开处理。

  • dp的初始化

从dp[i]的定义可知 0,1不能拆分为两个正数,因此dp[0] dp[1] 就不应该初始化,

只初始化dp[2] = 1,拆分数字2,得到的最大乘积是1。

  • 确定遍历顺序

从递归公式dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));中可以看dp[i]依赖于dp[i - j],因此先要从3开始计算最大乘积,则遍历顺序为从前向后的。

其次对于求解 i 拆分后所得最大乘积的计算过程也是循环处理的过程。在确定递推公式中枚举j的时候, j 是从1遍历到 i ,但由常识可知取 i / 2 之后的情况是重复处理,因此 j 只需从1遍历至 i / 2。

  • 举例推导dp数组

举例当n为10 的时候,dp数组里的数值,如下:

代码:

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n + 1);      //拆分各下标所得最大值
        dp[2] = 1;        //初始化
        for (int i = 3; i <= n; i++)        //计算n之前所有的最大值
            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.不同的二叉搜索树

题目链接:96 不同的二叉搜索树

题干:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

思考:动态规划。此题难在找出不同N值对应二叉搜索树个数间的规律。

  • 寻找重叠子问题

首先是 n 为 1以及 n 为2的情况,如下图

下面是 n 为3的情况,如下图

 

观察3为根节点的情况,右子树为空,左子树的两种情况正好对应n 为 2 的两种情况。其次观察1为根节点的情况,左子树为空,右子树的两种情况对应的二叉树形状不仍然对应 n 为 2的两种情况。再看2为根节点的情况,左右子树的形状正好对应n 为 1的情况。 

此时找到了重叠子问题,其实也就是发现可以通过dp[1] 和 dp[2] 来推导出来dp[3]的某种方式。

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]

如下图:


  •  动态规划五步曲

  • 确定dp数组(dp table)以及下标的含义

dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。

  • 确定递推公式

j相当于是头结点的元素,从1遍历到i为止。

所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量

  • dp数组如何初始化

由于推导的基础都是dp[0],因此只需要初始化dp[0]即可。

从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。所以初始化dp[0] = 1

  • 确定遍历顺序

首先是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。其次遍历i里面每一个数作为头结点的状态,用j来遍历。因此都为从前向后遍历

  • 举例推导dp数组

n为5时候的dp数组状态如图:

代码:

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];        //左子树节点j-1个,右子树节点i-j个的二叉树搜索树
        return dp[n];
    }
};

自我总结:

  • 开阔思路,寻找重复子问题以及前后联系。

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

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

相关文章

【linux】shell命令 | Linux权限

目录 1. shell命令以及运行原理 2. Linux权限的概念 3. Linux权限管理 3.1 文件访问者的分类 3.2 文件类型和访问权限 3.3 文件权限值的表示方法 3.4 文件访问权限的相关设置方法 4. file指令 5. 目录的权限 6. 粘滞位 7. 关于权限的总结 1. shell命令以及运行原理 …

常用的函数式接口(Supplier、Consumer、Predicate、Function)

目录 一.函数式接口作为方法的参数 二.函数式接口作为方法的返回值 三.常用的函数式接口 3.1生产型Supplier接口 3.2消费型Consumer接口 抽象方法&#xff1a;accept 默认方法&#xff1a;andThen 3.3判断型Predicate接口 抽象方法&#xff1a;test 默认方法&#xf…

MySQL5.7.24解压版安装教程

一、MySQL5.7.24解压版安装步骤 1.在指定目录下解压压缩包。比如在D:\Program Files\mysql下解压 2.在D:\Program Files\mysql\mysql-5.7.24-winx64目录下新建data文件夹&#xff0c;如果此目录下没有my.ini也需要手动创建 3.my.ini 文件配置内容如下 [mysqld] # 设置3306端口…

数据结构2月19日

题目&#xff1a;顺序表作业 代码&#xff1a; 功能区&#xff1a; #include <stdio.h>#include <stdlib.h>#include "./d2191.h"SeqList* create_seqList(){SeqList* list (SeqList*)malloc(sizeof(SeqList));if(NULL list){return NULL;}list->p…

多输入回归预测|GWO-CNN-LSTM|灰狼算法优化的卷积-长短期神经网络回归预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 卷积神经网络-长短期记忆网络&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容…

软件测试实训系统建设方案2024

软件测试实训室解决方案 一 、方案概述 软件测试实训解决方案是一个复杂且至关重要的过程&#xff0c;它确保了软件在开发过程中的各个模块能够正确地集成和交互。通过这一系列的测试步骤&#xff0c;开发团队能够及时发现并修复潜在的问题&#xff0c;从而提高软件的整体质量…

Chrome Captcha自动解决器,如何下载CapSolver

在数字时代&#xff0c;CAPTCHA&#xff08;Completely Automated Public Turing tests to tell Computers and Humans Apart&#xff0c;完全自动区分计算机和人类的公共图灵测试&#xff09;作为一项重要的安全措施&#xff0c;用于保护网站免受自动机器人的攻击。然而&#…

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived&#xff08;高可用性服务&#xff09;1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

分享一个UE的SmoothStep小技巧

SmoothStep节点可以制作更平滑的动画&#xff0c;而如果将max参数作为值传入将value和min参数作为约束&#xff0c;则可以做出类似冲击波的渐变效果&#xff1a; 并且通过修改value与min之间的数值差&#xff0c;可以调节渐变。 这个技巧主要就是可以产生硬边。 比如我们可…

Django——ORM增删改查

基本对象 model.objects 创建数据 可以通过django编写的命令行方式快捷创建数据 python manage.py shell 如果对模型层有任何修改都需要重启shell&#xff0c;否则操作容易出错 在shell中我们需要先引入我们的模型&#xff0c;如from bookstore.models import Book 然后通过…

套接字与套接字编程

对于刚刚学习计算机网络&#xff1a;自顶向下的同学们&#xff0c;在观看了中科大的视频---TCP Socket以及UDP Socket会感到些许疑惑&#xff0c;不过没事&#xff0c;在这篇小文章将会为你解开Socket的神秘面纱 什么是Socket&#xff1f;: Socket 是一套用于不同主机之间通信…

2024年面试季,大前端相关开发者不妨了解一下鸿蒙开发岗

搜狐&#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 美团&#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 360 &#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 高德&#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 新浪&#xff1a;我宣布与华为…

java——特殊文件日志技术

目录 特殊文件Properties文件XML文件XML文件有如下的特点XML的作用和应用场景解析XML文件 日志技术概述日志技术的体系结构Logback日志框架概述快速入门核心配置文件logback.xml日志级别项目中使用日志框架 特殊文件 Properties文件 后缀为.properties的文件&#xff0c;称之…

探索D咖智能饮品机器人的工作原理:科技、材料与设计的相互融合

智能饮品机器人是近年来随着人工智能和自动化技术的发展而崭露头角的一种创新产品。它将科技、材料和设计相互融合&#xff0c;为消费者带来了全新的饮品体验。下面D咖来探索智能饮品机器人的工作原理&#xff0c;以及科技、材料和设计在其中的作用。 首先&#xff0c;智能饮品…

悄悄话花费的时间(C语言)

题目描述 给定一个二叉树&#xff0c;每个节点上站着一个人&#xff0c;节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时&#xff0c;根节点所在位置的人有一个悄悄话想要传递给其他人&#xff0c;求二叉树所有节点上的人都接收到悄悄话花费的时间。 输入描述 …

企业统一身份中台,如何比传统单点登录SSO做得更好?

传统的单点登录SSO方案往往仅解决以下问题&#xff1a;多应用系统入口不统一&#xff0c;导致员工需要切换多个登录地址&#xff0c;重复多次登录&#xff0c;极大影响业务访问效率及员工登录体验。随着IT基础设施的增多&#xff0c;企业对全场景&#xff08;如网络、VPN、云桌…

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

flink内存管理,设置思路,oom问题,一文全

flink内存管理 1 内存分配1.1 JVM 进程总内存&#xff08;Total Process Memory&#xff09;1.2 Flink 总内存&#xff08;Total Flink Memory&#xff09;1.3 JVM 堆外内存&#xff08;JVM Off-Heap Memory&#xff09;1.4 JVM 堆内存&#xff08;JVM Heap Memory&#xff09;…

如何在Pycharm中导入第三方库(以pyecharts为例子)

打开Pycharm 点击右上角文件->设置->项目->pythonProject&#xff08;Python解释器&#xff09; 点击下图号 下一步&#xff1a;在搜索栏中直接搜索第三方包pyecharts并安装即可 以上便为使用Pycharm安装第三方库的全过程。 温馨小提示&#xff0c;如果大家在Pychar…

研学活动报名平台系统功能清单

中小学生社会实践活动、研学旅行等素质教育活动报名与管理平台&#xff0c;功能包含&#xff1a;活动分类&#xff0c;活动管理&#xff0c;在线报名缴费&#xff0c;扫码核销&#xff0c;会员特权体系&#xff0c;在线商城&#xff0c;研学互动。系统支持入驻老师自行创建研学…