数据结构刷题(三十):96不同的二叉搜索树、01背包问题理论、416分割等和子集

news2024/9/27 21:30:46

一、96. 不同的二叉搜索树

1.这个题比较难想递推公式,

dp[3],就是元素1为头结点搜索树的数量 + 元素2为头结点BFS的数量 + 元素3为头结点BFS的数量

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

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

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

用公式来说明就是

i>= 2, dp[i] += dp[p - 1] + dp[i - p]

2.需要注意dp数组的初始化

代码:

class Solution {
    public int numTrees(int n) {

        // 初始化
        int[] dp = new int[n + 1];
        // 分别初始化节点为0和1时的情况
        dp[0] = 1;
        dp[1] = 1;
        // 讨论j作为根结点时的情况 从左侧dp[0]到右侧dp[0]
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++){
                //对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加
                dp[i] += dp[j - 1] * dp[i - j] ;
            }
        }
        return dp[n];

    }
}

二、01背包问题理论

 

dp[i][j]是在背包达到j重量时,任取0-i中任意多个物品,所达到的最大价值, 其中i代表物品,j代表背包容量; 现在需要放入i物品到背包中,需要对比不放物品i和放入物品i两种情况。

  • 不放物品i:直接就是dp[i-1][j]的最有情况
  • 放入物品i:确定放入i时,则整个物品集就被分成两部分,1到i-1和第i个,同时物品i会把j空间里的wi给占据了,只剩下j-wi的空间给前面i-1, 所以dp[i-1][j-weight[i]]的意思就是还没加上物品i的重量(weight[i])时的最大价值, 最后再加上i物品的价值

细节:1.当 j-weight【i】<0 时,数组会越界,要加个if j<weight【i】则 dp【i】【j】=dp【i-1】【j】;

2.初始化时,当背包容量j=0时,不论i等于几,都默认为0;而i=0时,可以根据物品i=0的重量设定初始值。

3.当dp是二维数组时,双层for循环是可以颠倒顺序的

三、01背包问题理论(二)

1.将二维数组转换成一维的滚动数组

2.dp[j]指的是容量为j时的最大价值

3.列表后面的值需要通过与前面的值(可能在第一次循环中就确定了dp[1]的值,只能使用倒序才能获取到最开始的dp[1],而不是使用正序去更新dp[1])比较确定,因此要先处理,所以在嵌套for循环需要使用倒序

四、416. 分割等和子集

1.使用01背包思想,以下四点是使用01背包解决这个题的要求:

  • 背包的体积为sum / 2。(已知体积)
  • 背包要放入的商品(集合里的元素)重量为元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。(满足01背包要求)

2.需要注意本题中的重量也就是价值这一说法

(1)01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

    本题,相当于背包里放入数值,那么物品i的重量是nums[i],其价值也是nums[i]。

(2)如果dp[j] == j 说明,集合中的子集总和正好可以凑成总和j

class Solution {
    public boolean canPartition(int[] nums) {

        if (nums.length == 0 && nums == null)
            return false;
        int n = nums.length;
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        // 判断和是否为奇数
        if (sum % 2 == 1) return false;
        int target = sum / 2;
        // dp[j]表示 当背包重量为j时,所具有的最大价值(这个题价值也就是重量)
        int[] dp = new int[target + 1];
        for (int i = 0; i < n; i++) {
            for (int j = target; j >= nums[i]; j--){
                //物品 i 的重量是 nums[i],其价值也是 nums[i]
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }
        }
        // 只需要对两个子集中的一个进行判断即可,
        return dp[target] == target;
    }
}

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

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

相关文章

AWS Lambda - 第二部分

Hello大家好&#xff0c;我们今天继续讨论AWS Lambda的内容。 Lambda的网络 首先&#xff0c;我们来讨论一下Lambda的网络&#xff0c;联网相关的内容。 在部署Lambda时&#xff0c;在默认情况下&#xff0c;Lambda函数是部署和运行在AWS的一个安全的VPC中&#xff0c;是在您…

“大运”有我丨智安网络护航大运,荣获成都市公安局感谢信!

近日&#xff0c;深圳市智安网络有限公司四川分公司&#xff08;以下简称“智安网络”&#xff09;荣幸受邀参与第31届世界大学生夏季运动会网络安全检查工作&#xff0c;对中和体育中心场馆安全漏洞检测进行现场技术支撑。 智安网络对此次网络安全检查工作高度重视&#xff0…

PySpark基础入门(2):RDD及其常用算子

更好的阅读体验&#xff1a;PySpark基础入门&#xff08;2&#xff09;&#xff1a;RDD及其常用算子 - 掘金 (juejin.cn) 目录 RDD简介 RDD Coding RDD简介 RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff0c;是一个弹性分布式数据集&#xff0c;是Sp…

带你快速入门光模块行业

一、行业介绍 光纤通信&#xff08;简称光通信&#xff09;是利用光导纤维传输光波信号的一种通信方式&#xff0c;于上世纪六七十年代由华裔科学家高锟博士等人率先提出。 光通信是以激光作为信息载体&#xff0c;以光纤作为传输媒介的通信方式&#xff0c;现已取代电通信成…

if __name__ == “__main__“: 理解

if __name__ "__main__": 是 Python 中常用的一种条件判断语句&#xff0c;主要作用是在当前模块作为程序入口时执行一些特定的代码&#xff0c;而在被其它模块引入时不执行这些特定的代码。 具体来说&#xff0c;当一个 Python 模块被导入时&#xff0c;Python 解…

关注度拉满,RSAC 2023 热门安全工具速览

RSAConference2023于当地时间4月24日在旧金山正式拉开帷幕。自上届RSAC以来&#xff0c;网络安全行业发生了巨大的变化&#xff0c;尤其是以OpenAI聊天机器人为代表的内容生成型AI的兴起&#xff0c;对网络防御和攻击的影响比以往任何时候都更加明显。 今年&#xff0c;与RSAC相…

数据结构之第十章、Java对象的比较

目录 一、PriorityQueue&#xff08;堆&#xff09;中插入对象 二、元素的比较 2.1基本类型的比较 2.2对象比较的问题 三、对象的比较 3.1覆写基类的equals 3.2基于Comparble接口类的比较 3.3基于比较器比较 3.4三种方式对比 3.5代码实现 四、集合框架中PriorityQu…

大型医院影像PACS系统三维重建技术(获取数据、预处理、配准、重建和可视化)

PACS&#xff08;Picture Archiving and Communication System&#xff09;系统作为医学图像的存储和传输平台&#xff0c;为医生和患者提供了便捷高效的诊疗服务支持。近年来&#xff0c;三维重建技术在PACS系统中的应用越来越广泛。 一、三维重建技术的基本原理 在PACS系统…

JS 中的 performance,测量web应用性能

文章目录 属性和方法performance.memory 内存performance.navigation 页面的来源信息performance.timing 时间消耗相关时间计算Performance.mark()performance.now() Web Performance API 允许网页访问某些函数来测量网页和 Web 应用程序的性能 performance 包含如下属性和方法…

Linux基础IO【软硬链接与动静态库】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、软硬链接1.1、基本认知1.2、实现原理1.3、应用场景1.4、取消链接1.5、ACM时…

JavaWeb ( 一 ) HTTP协议

1.http协议 1.0.Web Web指的是World Wide Web&#xff0c;也称为万维网&#xff0c;是一种基于互联网的信息系统&#xff0c;由全球数百万个网站组成。它允许用户通过使用网页浏览器访问和交互信息&#xff0c;例如阅读新闻、购物、发送和接收电子邮件、社交媒体等。 Web使用…

解密.[support2022@cock.li].faust后缀勒索病毒加密的文件:拯救您的企业数据的完整指南!

引言&#xff1a; 您的企业数据是您业务的核心。但是&#xff0c;当.[support2022cock.li].faust后缀勒索病毒突袭您的系统时&#xff0c;您的数据将遭受沉重打击。这种恶意软件利用高级加密算法&#xff0c;将您的文件锁定在无法访问的状态。在这篇详细的指南中&#xff0c;9…

tcp/ip

这里写自定义目录标题 线程 防止阻塞 123 windows下4 https://zhuanlan.zhihu.com/p/139454200 https://www.bilibili.com/video/BV1eg411G7pW/?spm_id_from333.337.search-card.all.click&vd_sourcee7d12c9f66ab8294c87125a95510dac9 with socket.socket() as s:s.bind(…

xcode Swift Log CocoaLumberjack

参考【iOS】CocoaLumberJack日志库集成 - 简书 logging - How to capture Device Logs in iOS during Runtime into a file in Documents Directory from iPhone? - Stack Overflow GitHub - apple/swift-log: A Logging API for Swift 如何导出日志 方法一发邮件&#xf…

Vue——Elementui案例实现

需求分析: 对于上面要仿照的页面先新建一个页面组件EmpView.vue组件在views文件夹下 基本页面布局 对于上面页面的布局其实在Element当中也可以找到相应可以实现的组件, 成功找到一个符合要求的布局&#xff0c;直接复制粘贴到项目里面 此时页面相应的位置已经有了对应的占位单…

自动化运维工具 Ansible

目录 Puppet 自动运维工具特点&#xff1a; Saltstack 自动运维工具特点&#xff1a; Ansible 自动运维工具特点: Ansible 运维工具原理 Ansible 管理工具安装配置 Ansible 工具参数详解 Ansible ping 模块实战 Ansible command 模块实战 Ansible copy 模块实战 Ansib…

uboot第二阶段 start_armboot函数代码分析

1.1、start_armboot函数简介 这个函数整个构成了uboot启动的第二阶段。 1.2、uboot第二阶段做的事情 uboot第一阶段主要就是初始化了SoC内部的一些部件&#xff08;譬如看门狗、时钟、串口…&#xff09;&#xff0c;然后初始化DDR并且完成重定位。那么&#xff0c;uboot的第…

数字化转型导师坚鹏:企业数字化营销能力提升

企业数字化营销能力提升 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不清楚数字化营销对企业发展有什么影响&#xff1f; 不知道如何提升企业数字化营销能力&#xff1f; 不知道企业如何开展数字化营销工作&#xff1f; 课程特色&#xff1a; 原创企业数…

vcruntime140.dll无法继续执行代码?vcruntime140.dll如何修复?只需要3步即可

vcruntime140.dll是用于Microsoft Visual C Redistributable&#xff08;可再发行组件&#xff09;的一部分&#xff0c;它是一个动态链接库文件&#xff0c;包含了该软件包提供的运行库。在许多应用程序和游戏中&#xff0c;vcruntime140.dll文件经常被使用。如果该文件缺失或…

Tkinter正则表达式工具

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入tkinter和re模块&#x1f3f3;️‍&#x1f308; 2. 设置窗口居中&#x1f3f3;️‍&#x1f308; 3. 设置lable、text、button布局&#x1f3f3;️‍&#x1f308; 4. 设置下拉列表框&#x1f3f3;️‍&#x1f308; 5. 清空文…