【算法挨揍日记】day46——377. 组合总和 Ⅳ\、96. 不同的二叉搜索树

news2024/11/18 23:38:16

 377. 组合总和 Ⅳ

377. 组合总和 Ⅳ

题目描述:

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

解题思路:

算法思路:
⼀定要注意,我们的背包问题本质上求的是「组合」数问题,⽽这⼀道题求的是「排列数」问题。
因此我们不能被这道题给迷惑,还是⽤常规的 dp 思想来解决这道题。
1. 状态表⽰:
这道题的状态表⽰就是根据「拆分出相同⼦问题」的⽅式,抽象出来⼀个状态表⽰:
当我们在求 target 这个数⼀共有⼏种排列⽅式的时候,对于最后⼀个位置,如果我们拿出数组
中的⼀个数 x ,接下来就是去找 target - x ⼀共有多少种排列⽅式。
因此我们可以抽象出来⼀个状态表⽰:
dp[i] 表⽰:总和为 i 的时候,⼀共有多少种排列⽅案。
2. 状态转移⽅程:
对于 dp[i] ,我们根据「最后⼀个位置」划分,我们可以选择数组中的任意⼀个数
nums[j] ,其中 0 <= j <= n - 1
nums[j] <= target 的时候,此时的排列数等于我们先找到 target - nums[j] 的⽅
案数,然后在每⼀个⽅案后⾯加上⼀个数字 nums[j] 即可。
因为有很多个 j 符合情况,因此我们的状态转移⽅程为: dp[i] += dp[target -
nums[j] ,其中 0 <= j <= n - 1
3. 初始化:
当和为 0 的时候,我们可以什么都不选,「空集」⼀种⽅案,因此 dp[0] = 1
4. 填表顺序:
根据「状态转移⽅程」易得「从左往右」。
5. 返回值:
根据「状态表⽰」,我们要返回的是 dp[target] 的值。

解题代码:

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
            int n=nums.size();
            vector<double>dp(target+1);
            dp[0]=1;
            for(int i=1;i<=target;i++)
            {
                for(int j=0;j<n;j++)
                    if(i>=nums[j])dp[i]+=dp[i-nums[j]];
            }
            return dp[target];
    }
};

96. 不同的二叉搜索树

96. 不同的二叉搜索树

题目描述:

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

解题思路:

算法思路:
这道题属于「卡特兰数」的⼀个应⽤,同样能解决的问题还有「合法的进出栈序列」、「括号匹配
的括号序列」、「电影购票」等等。如果感兴趣的同学可以「百度」搜索卡特兰数,会有很多详细
的介绍。
1. 状态表⽰:
这道题的状态表⽰就是根据「拆分出相同⼦问题」的⽅式,抽象出来⼀个状态表⽰:
当我们在求个数为 n BST 的个数的时候,当确定⼀个根节点之后,左右⼦树的结点「个数」
也确定了。此时左右⼦树就会变成相同的⼦问题,因此我们可以这样定义状态表⽰:
dp[i] 表⽰:当结点的数量为 i 个的时候,⼀共有多少颗 BST
难的是如何推导状态转移⽅程,因为它跟我们之前常⻅的状态转移⽅程不是很像。
2. 状态转移⽅程:
对于 dp[i] ,此时我们已经有 i 个结点了,为了⽅便叙述,我们将这 i 个结点排好序,并且编
1, 2, 3, 4, 5.....i 的编号。
那么,对于所有不同的 BST ,我们可以按照下⾯的划分规则,分成不同的 i 类:「按照不同的
头结点来分类」。分类结果就是:
i. 头结点为 1 号结点的所有 BST
ii. 头结点为 2 号结点的所有 BST
iii. ......
如果我们能求出「每⼀类中的 BST 的数量」,将所有类的 BST 数量累加在⼀起,就是最后结
果。
接下来选择「头结点为 j 号」的结点,来分析这 i BST 的通⽤求法。
如果选择「 j 号结点来作为头结点」,根据 BST 的定义:
i. j 号结点的「左⼦树」的结点编号应该在 [1, j - 1] 之间,⼀共有 j - 1 个结点。
那么 j 号结点作为头结点的话,它的「左⼦树的种类」就有 dp[j - 1] 种(回顾⼀下
我们 dp 数组的定义哈);
ii. j 号结点的「右⼦树」的结点编号应该在 [j + 1, i] 之间,⼀共有 i - j 个结点。那
j 号结点作为头结点的话,它的「右⼦树的种类」就有 dp[i - j] 种;
根据「排列组合」的原理可得: j 号结点作为头结点的 BST 的种类⼀共有 dp[j - 1] *
dp[i - j] 种!
因此,我们只要把「不同头结点的 BST 数量」累加在⼀起,就能得到 dp[i] 的值: dp[i]
+= dp[j - 1] * dp[i - j] ( 1 <= j <= i) 。「注意⽤的是 += ,并且 j 1
化到 i 」。
3. 初始化:
我们注意到,每⼀个状态转移⾥⾯的 j - 1 i - j 都是⼩于 i 的,并且可能会⽤到前⼀
个的状态(当 i = 1 j = 1 的时候,要⽤到 dp[0] 的数据)。因此要先把第⼀个元素初始
化。
i = 0 的时候,表⽰⼀颗空树,「空树也是⼀颗⼆叉搜索树」,因此 dp[0] = 1
4. 填表顺序:
根据「状态转移⽅程」,易得「从左往右」。
5. 返回值:
根据「状态表⽰」,我们要返回的是 dp[n] 的值。

 解题代码:

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n + 1,0); // dp[i] 表⽰:当结点的数量为 i 个的时候,⼀共有多少颗 BST
        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];
    }
};

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

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

相关文章

深度生成模型之图像翻译GAN ->(个人学习记录笔记)

文章目录 深度生成模型之图像翻译GAN图像翻译的应用1. 风格迁移2. 数据增强3. 经典图像任务4. 内容创作5. 人脸图像编辑6. 人体图像编辑 图像翻译模型1. 有监督图像翻译模型2. 无监督图像翻译模型3. 多域图像翻译模型 深度生成模型之图像翻译GAN 图像翻译的应用 1. 风格迁移 …

基于python的leetcode算法介绍之动态规划

文章目录 零 算法介绍一 例题介绍 使用最小花费爬楼梯问题分析 Leetcode例题与思路[118. 杨辉三角](https://leetcode.cn/problems/pascals-triangle/)解题思路题解 [53. 最大子数组和](https://leetcode.cn/problems/maximum-subarray/)解题思路题解 [96. 不同的二叉搜索树](h…

网络安全B模块(笔记详解)- 数字取证

数据分析数字取证-attack 1.使用Wireshark查看并分析Windows 7桌面下的attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户的IP地址,并将恶意用户的IP地址作为Flag(形式:[IP地址])提交; 解析:http.request.method==POST ​ Flag:[172.16.1.102] 2.继续…

属龙人的性格命运怎么样呢?

​ 属龙人慷慨大方&#xff0c;为人友爱&#xff0c;人缘很好&#xff0c;才情十足&#xff0c;细腻的思维和独到的见解常常能打动别人的心弦&#xff0c;在社交场合游刃有余&#xff0c;且魅力独特&#xff0c;身边不乏追求者。属龙人感情细腻&#xff0c;浪漫多情&#xff0…

通过软盘拷贝文件 - 华为OD统一考试

OD统一考试(B卷) 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究但此电脑除了有一个3.5寸软盘驱动器以外&#xff0c;没有任何手段可以将文件持贝出来&#xff0c;而且只有一张软盘可以…

开源CalDAV和CardDav网页客户端InfCloud

本文应网友 畅天 的要求折腾。他遇到了跨域问题&#xff0c;所以老苏找了个二合一的镜像来规避。其中使用的 Baikal 和 InfCloud 都是最新的版本&#xff1b; 什么是 Baikal &#xff1f; Baikal 是一个免费的开源自托管 CalDAV 和 CardDAV 服务器&#xff0c;适用于想要管理其…

普中STM32-PZ6806L开发板(HAL库函数实现-TIM5 设置 PWM input, 获取频率跟占空比)

简介 初始化 TIM5 为 PWM input CH1&#xff0c; 获取输入PWM的频率和占空比电路原理图 连线 将 PC7 与 PA0使用跳线进行连接 其他知识 APIs /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); // 堵塞捕获开…

微信好友添加频繁的原因

01 微信好友添加频繁的原因 1. 添加好友的频率太高&#xff1a;短时间内添加多个好友&#xff0c;系统会认为账号被盗&#xff0c;从而限制用户添加好友&#xff1b; 2. 频繁的发送好友请求&#xff1a;在短时间内连续发送好友请求&#xff0c;也会导致微信限制操作&#xff0…

2021-01-03 excel实现列递增,行保持不变

需求&#xff1a;excel文档数据操作的时候发现自动递增只能实现列不变行号递增 我这里里需要的是列递增行不变 解决方式&#xff1a;通过一些函数的组合使用 INDIRECT("驻场明细!"&CHAR(ROW()62)&ROW(驻场明细!A$28)) INDIRECT()函数的使用&#xff1a; INDI…

Android studio ViewPager2应用设计

一、ViewPager2应用场景&#xff1a; ViewPager2是一个功能强大的滑动容器&#xff0c;提供灵活的页面切换和布局定制功能&#xff0c;使得应用程序界面更加丰富和交互性强&#xff0c;主要应用于以下场景&#xff1a; 1&#xff09;、实现引导页或欢迎页&#xff1a;ViewPag…

妙手ERP功能更新:优化各平台描述设置、Ozon去除会员价设置、对接速虎速运.......

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 优化各平台认领配置中的描述设置&#xff1a;具体优化见各平台描述设置 - 采集亚马逊产品到公用采集箱时&#xff0c;简易描述默…

助力成长的开源项目 —— 筑梦之路

闯关式 SQL 自学&#xff1a;sql-mother 免费的闯关式 SQL 自学教程网站&#xff0c;从 0 到 1 带大家掌握常用 SQL 语法&#xff0c;目前一共有 30 多个关卡&#xff0c;希望你在通关的时候&#xff0c;变身为一个 SQL 高手。除了闯关模式之外&#xff0c;这个项目支持自由选…

基于ssm的校友录的设计与实现+jsp论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

声明式管理方(yaml)文件

声明式管理方(yaml)文件: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中。 3、编辑好的yaml文件需要依靠陈述是还是要依靠陈述式的命令发布到k8s集群当中 create只能创建&#xff0c;不能更新。从指定yaml文件中读取配置&#…

深度确定性策略梯度 DDPG

深度确定性策略梯度 DDPG 深度确定性策略梯度 DDPG模型结构目标函数算法步骤适合场景 深度确定性策略梯度 DDPG A2C、A3C 都是在线策略&#xff0c;在与环境交互时&#xff0c;样本参数更新效率低&#xff0c;所以主要是应用在离散空间&#xff0c;计算量没那么大。 DDPG 专用…

脆弱的SSL加密算法漏洞原理以及修复方法

漏洞名称&#xff1a;弱加密算法、脆弱的加密算法、脆弱的SSL加密算法、openssl的FREAK Attack漏洞 漏洞描述&#xff1a;脆弱的SSL加密算法&#xff0c;是一种常见的漏洞&#xff0c;且至今仍有大量软件支持低强度的加密协议&#xff0c;包括部分版本的openssl。其实&#xf…

x-cmd pkg | lazygit - git 命令的终端 UI

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 lazygit 由 Jesse Duffield 于 2018 年使用 Go 语言构建的 git 终端交互式命令行工具&#xff0c;旨在终端界面中便捷管理 git 存储库。 首次用户 使用 x lazygit 即可自动下载并使用 在终端运行 eval "$(curl …

栈的经典算法问题(算法村第四关白银挑战)

括号匹配问题 有效的括号 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类…

包围盒体积-体积计算

文章目录 环境&#xff1a;1.1 包围盒法介绍&#xff1a;2.1 python代码3.1 可视化4.1 体积Calculation 环境&#xff1a; Open3D 1.1 包围盒法介绍&#xff1a; 求解离散点最优包围空间 常用的凸包算法&#xff1a; AABB OOB 2.1 python代码 conda activete deeplabv3plus(…

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 大小端字节序

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! Hello&#xff0c;大家好我是硬核王同学&#xff0c;是一名刚刚工作一年多的Linux工程师&#xff0…