算法打卡day35

news2024/11/27 0:39:31

今日任务:

1)343. 整数拆分

2)96.不同的二叉搜索树

3)复习day11

343. 整数拆分

题目链接:343. 整数拆分 - 力扣(LeetCode)

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分哔哩哔哩bilibili

思路:

1. 创建一个一维数组 dp,其中 dp[i] 表示将正整数 i 拆分后得到的最大乘积。

2. 初始时,将 dp[0]dp[1] 都设为0,因为0和1无法拆分成至少两个正整数的和。

3. 对于正整数 i,从 1 开始遍历到 i-1,对每个位置 j,计算将 i 拆分成 ji-j 的和,然后将这两部分的最大乘积相乘得到当前的最大乘积。

4. 在计算 dp[i] 时,需要考虑 i-j 是否继续拆分,如果 i-j 继续拆分后的最大乘积大于 i-j 本身,那么就可以继续拆分,否则不拆分。

5. 最后返回 dp[n],即正整数 n 拆分后得到的最大乘积。

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[2] = 1  # 2只能拆分为1+1,所以初始为1

        for i in range(3, n + 1):
            for j in range(1, (i+1)//2+1):
                # 将i拆分成j和i-j,比较i-j的拆分结果与i-j本身的乘积,取最大值
                dp[i] = max(dp[i], max(j * dp[i - j], j * (i - j)))

        return dp[n]

第二层for循环时,最初的想法从1遍历到i-1,去拆分。但实际上,由于对称性,只需要遍历到i的一半就足够了。这样做可以减少不必要的计算,提高代码效率。

刚才的思路是动态规划,这题我们还可以找寻数学规律去做

  • 首先考虑特殊情况,当n为2时,最大乘积为1;当n为3时,最大乘积为2。
  • 对于其他大于3的n,尽可能多地拆分成3,并计算拆分后的乘积。
  • 根据数学规律,当n为3的倍数时,将n全部拆分为3可以得到最大乘积。
  • 当n除以3余数为1时,将最后一个3拆分为2*2可以得到更大的乘积。
  • 当n除以3余数为2时,直接拆分为3的乘积即可。
class Solution:
    def integerBreak(self, n: int) -> int:
        # 如果n为2,只能拆分为1+1,所以乘积为1
        if n == 2:
            return 1
        # 如果n为3,只能拆分为1+2,所以乘积为2
        if n == 3:
            return 2
        # 如果n可以被3整除,全部拆分为3的乘积会得到最大值
        if n % 3 == 0:
            return 3 ** (n // 3)
        # 如果n除以3余数为1,那么将最后的3拆分为2*2可以得到更大的乘积
        if n % 3 == 1:
            return 3 ** ((n - 4) // 3) * 4
        # 如果n除以3余数为2,直接拆分为3的乘积
        if n % 3 == 2:
            return 3 ** (n // 3) * 2

96.不同的二叉搜索树

题目链接:96. 不同的二叉搜索树 - 力扣(LeetCode)

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例 1:

输入:n = 3
输出:5
解析:[1,None,3,2,None],[1,None,2,None,3],[2,1,3],[3,2,None,1,None],[3,1,None,,None,2]

示例 2:
输入:n = 1
输出:1

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树哔哩哔哩bilibili

思路:

这个问题可以通过动态规划来解决。我们可以定义一个数组 dp,其中 dp[i] 表示以 1 ... i 为节点组成的二叉搜索树的数量。然后,我们可以通过迭代计算 dp[i] 的值,直到 dp[n] 为止。

1. 当 n = 0n = 1 时,只有一种情况,即空树或只有一个节点的树,此时 dp[0] = dp[1] = 1

2. 对于任意 i,我们可以将2 ... i 中的每个数字都作为根节点,然后分别计算左子树和右子树的数量,最后将左右子树的数量相乘即可得到以 i 为根节点的二叉搜索树的数量。这个过程可以表示为 dp[i] = sum(dp[j - 1] * dp[i - j]),其中 j 表示根节点的值。   

  • 当n = 2 有两个节点时:
    • 我们以1为根节点时,其左子树没有节点,故左子树只有一种情况,那就是空,右子树只有一个节点,那就是n=1的情况故为1。组合起来有1*1=1种情况
    • 我们以2为根节点时,其左子树只有一个节点,那就是n=1的情况故为1,右子树没有节点故为空一种情况。组合起来有1*1=1种情况
    • 故合起来n = 2 有两个节点时有1+1=2两种情况

        

  • 当n = 3 有三个节点时:
    • 我们以1为根节点时,其左子树没有节点故为空1种情况,右子树只有两个节点,那就是n=2的情况故为2。组合起来有1*2=2种情况
    • 我们以2为根节点时,其左右子树只有一个节点,那就是n=1的情况故为1,组合起来有1*1=1种情况
    • 我们以3为根节点时,其左子树只有两个节点,那就是n=2的情况故为2,右子树没有节点故为空1种情况
    • 合起来n = 2 有两个节点时有2+1+2=5两种情况

        

3.最终返回 dp[n] 即可。

class Solution:
    def numTrees(self, n: int) -> int:
        # 初始化动态规划数组,dp[i] 表示以 1 ... i 为节点组成的二叉搜索树的数量
        dp = [0] * (n + 1)
        dp[0]= 1

        for i in range(1, n + 1):
            for j in range(i):
                dp[i] += dp[j] * dp[i - j - 1]

        return dp[n]

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

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

相关文章

Vue3 + Element-Plus 使用 Table 插槽时数据未及时更新

Vue3 Element-Plus 使用 Table 插槽时数据未及时更新 问题重现解决方法最终效果 问题重现 这里我已经通过二级分类 id 查询到一级分类和二级分类&#xff0c;但是使用插槽和 v-for 渲染出来还是之前的分类 id&#xff0c;但是一点击表格或者保存代码他又能正常刷新出来。 <…

算法设计与分析实验报告c++实现(矩阵链相乘、投资问题、完全背包问题、数字三角形、最小生成树、背包问题)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用动态…

1.2MHz,固定频率白光LED驱动器

一、产品概述 TX6216是一款升压转换器&#xff0c;设计用于通过单节锂离子电池驱动多达7个串联的白光LED。 TX6216采用电流模式&#xff0c;固定频率架构来调节LED电流&#xff0c;LED电流通过外部电流检测电阻测量。其低104mV反馈电压可降低功率损耗并提高效率。 TX6216具有…

笔试题1 -- 吃掉字符串中相邻的相同字符(点击消除_牛客网)

吃掉字符串中相邻的相同字符 文章目录 吃掉字符串中相邻的相同字符题目重现解法一&#xff1a;(基于 erase() 函数实现)解法二&#xff1a;&#xff08;利用 栈 辅助实现&#xff09;总结 题目链接&#xff1a; 点击消除_牛客网 题目重现 牛牛拿到了一个字符串。 他每次“点击…

JMeter控制器数据库获取一组数据后遍历输出

目录 1、测试计划中添加Mysql Jar包 2、添加线程组 3、添加 jdbc connection configuration 4、添加JDBC Request&#xff0c;从数据库中获取数据 5.获取数据列表&#xff0c;提取所有goodsName信息 6.通过添加控制器遍历一组数据 6.1 方式一&#xff1a;循环控制器方式 …

Vue3从入门到实战:深度掌握通信插槽slot

slot_默认插槽的概念&#xff1a; 在Vue中&#xff0c;插槽&#xff08;slot&#xff09;是一种用于在组件中插入内容的特殊技术。默认插槽是其中一种类型的插槽&#xff0c;它允许你在组件的模板中指定一个位置&#xff0c;以便在使用组件时插入自定义的内容。 想象一下你有…

Linux中安装seata

Linux中安装seata 一、准备1、环境2、下载3、上传到服务器4、解压 二、配置1、备份配置文件2、导入sql3、修改配置前4、修改配置后5、在nacos中配置 三、使用1、启动2、关闭 一、准备 1、环境 因为要在 nacos 中配置&#xff0c;要求安装并启动 nacos 。可以参考这篇博客。 …

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架&#xff0c;目前行业里最流行的orm框架非Mybatis莫属了&#xff0c;而Mybatis框架本身没有提供api实现&#xff0c;所以市面上推出了Mybatis plus系列框架&#xff0c;plus版是mybatis增强工具&#xff0c;用于简化My…

【JAVA基础篇教学】第十二篇:Java中多线程编程

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第十二篇&#xff1a;Java中多线程编程。 多线程编程是利用多个线程同时执行任务来提高程序的效率和性能。在 Java 中&#xff0c;多线程编程可以通过继承 Thread 类或实现 Runnable 接口来实现。下面是一个简单的多线程…

IntelliJ IDEA2024 安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 IDEA&#xff08;Integrated Development Environment for Apache&#xff09; 是一款专为 Apache 开发者设计的集成开发环境。该软件提供了丰富的功能和工具&#xff0c;帮助开发者更高效地创建、调试和部署 Apache 项目。 主…

自定义类型: 结构体 (详解)

本文索引 一. 结构体类型的声明1. 结构体的声明和初始化2. 结构体的特殊声明3. 结构体的自引用 二. 结构体内存对齐1. 对齐规则2. 为啥存在对齐?3. 修改默认对齐值 三. 结构体传参四. 结构体实现位段1. 什么是位段?2. 位段的内存分配3. 位段的应用4. 位段的注意事项 ​ 前言:…

计算机系列之操作系统的系统

2、大话操作系统的启动 当按下开机键时&#xff0c;BIOS 就会开始执行 ​ BIOS 就是放在主板上 ROM 里面的一段程序。 ​ ROM Read Only Memory&#xff08;只能读取的内存&#xff09; ​ 所以 BIOS 在出厂的时候就可以直接写死在 ROM 里面。 ​ 每次开机的时候&#xff…

JavaScript 高性能编程 —— 加载和运行

JavaScript 在浏览器中的性能,可认为是开发者所要面对的最重要的可用性问题。此问题因 JavaScript 的阻塞特征而复杂,也就是说,当 JavaScript 运行时其他的事情不能被浏览器处理。 事实上,大多数浏览 器使用单进程处理 UI 更新和 JavaScript 运行等多个任务,而同一时间只能…

Python --- 在python中安装NumPy,SciPy和Matplotlib(Windows平台)

在python中安装NumPy&#xff0c;SciPy和Matplotlib(Windows平台) NumPy NumPy是Python的一个最常用最基本的扩展程序库之一&#xff0c;主要用于矩阵运算或数组计算。很多其他的python库都要依赖于NumPy才能跑。 NumPy的发展史&#xff1a; Matrix-sig 1995年&#xff0c;特殊…

设定延迟任务和定时任务并优化定时任务

一丶设定延时任务 1.设定延迟任务要求如下 ①在系统中建立easylee用户&#xff0c;设定其密码为easylee ②延迟任务由root用户建立 ③要求在5小时后备份系统中的用户信息文件到/backup中 ④确保延迟任务是使用非交互模式建立 ⑤确保系统中只有root用户和easylee用户可以执…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Check Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Check Box的使用及说明 文章编号&#xff1a;…

P5730 【深基5.例10】显示屏

思路&#xff1a; 此题只需要两层循环&#xff0c;通过数组映射即可求出答案 AC代码&#xff1a; #include<iostream>using namespace std;typedef long long ll; const int N 10; int a[N];int main() {ll n,m;cin >> n >> m;for(ll in;i<m;i){ll nu…

OpenHarmony实战开发-Worker子线程中解压文件。

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 1.点击解压按钮&#xff0c;解压test.zip文件&#xff0c…

【JavaSE】你真的了解内部类吗?

前言 本篇会详细讲解内部类的四种形式&#xff0c;让你掌握内部类~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 内部类介绍 实例内部类 定义 调用 静态内部类 定义 调用 匿名内部类 定义和调用1 调用方法2 …

Linux的重要命令(二)+了解Linux目录结构

目录 一.Linux的目录结构 二.查看文件内容命令 1.cat 命令 2.more 命令 3.less 命令 4.head 命令 5.tail 命令 6.拓展 head 和 tail 的其他用法 ​编辑 三.统计文件内容的命令-wc ​编辑 四.检索和过滤文件内容的命令-grep ​编辑 ​编辑 五.压缩命令 gzip 和 bz…