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

 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];
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷大数据技术-数据湖Hudi视频教程-笔记01【概述、编译安装】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

Java并发 - Java中所有的锁

Java 中提供了多种锁机制&#xff0c;用于实现多线程之间的同步和互斥。 1. 乐观锁&悲观锁 1.1 特点 乐观锁&#xff1a;假定多个事务之间很少发生冲突&#xff0c;操作不加锁。发生错误的时候进行回滚或重试。 悲观锁&#xff1a;假定冲突可能频繁发生&#xff0c;先…

Linux ---- 进程和计划任务

内核功用&#xff1a;进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等 一、程序和进程的关系 1、程序 保存在硬盘、光盘等介质中的可执行代码和数据静态保存的代码 2、进程 在CPU及内存中运行的程序代码动态执行的代码父、子进程 每个程序可以创建一个或多个…

[Redis实战]分布式锁-redission

五、分布式锁-redission 5.1 分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题就是指获得锁的线程可以再次进入到相同的锁的代码中&#xff0c;可重入锁的意义在于防止死锁。比如HashTable这样的代码中&#xf…

web自动化测试详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

Linux_apachectl 网页优化

1.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配 置&#xff0c;才能让 Apache 发挥出更好的性能。反过来说&#xff0c;如果 Apache 的配置非常糟糕&#xff0c; Apache 可能无法正常为我们服务。因此&#xff0c…

手把手教你在Ubuntu22上安装VideoRetalking

VideoReTalking是一种新系统&#xff0c;可以根据输入音频编辑真实世界的谈话头部视频的面孔&#xff0c;即使具有不同的情感&#xff0c;也能生成高质量和口型同步的输出视频。我们的系统将这个目标分解为三个连续的任务&#xff1a; &#xff08;1&#xff09;具有规范表情的…

【UEFI基础】EDK网络框架(UNDI)

UNDI UNDI代码综述 UNDI全称Universal Network Driver Interface&#xff0c;它虽然属于UEFI网络框架的一部分&#xff0c;但是并没有在EDK开源代码中实现。不过目前主流网卡厂商都会提供UEFI下的网络驱动&#xff0c;并且大部分都实现了UNDI&#xff0c;这样BIOS下就可以通过…

Lazada商品详情API(lazada.item_get)参数详解:如何传递正确的参数

一、引言 随着电子商务的快速发展&#xff0c;获取商品详情成为了电商应用程序中的一项重要功能。Lazada作为东南亚地区知名的电商平台&#xff0c;提供了Lazada商品详情API&#xff08;lazada.item_get&#xff09;以方便开发者获取商品详情。本文将详细介绍如何使用Lazada商…

交换机03_基本配置

一、思科设备的命令行基础 1、进入设备的命令行界面 设备支持命令行 去查看设备上的接口&#xff0c;是否有console口需要有console线 右击此电脑设备管理器需要通过超级终端软件进行连接&#xff0c;如putt、secret CRT、xshell等软件 &#xff08;1&#xff09;思科模拟器…

【LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

深入探讨关于Redis的底层

1.1为什么Redis存储比关系型数据库快&#xff1a; 数据存储在内存中&#xff08;比如企业项目中用户表中有一个亿的用户&#xff0c;如果再来注册一个用户&#xff0c;或者登录&#xff0c;必须先判断是否有这个数据&#xff0c;这个时候如果直接查询数据库的话&#xff0c;对服…

指增的超额来自于哪里,2024的乾坤九法,美股的宏观估值双杀

图片截止到&#xff1a;2024/1/4 上证 周四 -0.43% 市场热点分析 1. 2024元旦后国内外市场都出现了不同程度的下跌。技术面国内市场一直走在72日均线之下&#xff0c;而且没有形成底部&#xff0c;熊市还会延续。宏观方面&#xff0c;12月官方PMI持续向下&#xff0c;小企业更多…

SSL/TLS 握手过程详解

SSL握手过程详解 1、SSL/TLS 历史发展2、SSL/TLS握手过程概览2.1、协商交换密码套件和参数2.2、验证一方或双方的身份2.3、创建/交换对称会话密钥 3、TLS 1.2 握手过程详解4、TLS 1.3 握手过程详解5、The TLS 1.2 handshake – Diffie-Hellman Edition 1、SSL/TLS 历史发展 可…

QML 项目中使用 Qt Design Studio 生成的UI界面

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 今天来和大家聊一下 Qt Design Studio 这个软件。这个软件的主要功能是用来快速完成 UI 界面&#xff0c;就和 widget 中的 desig…

(湖科大教书匠)计算机网络微课堂(下)

第四章、网络层 网络层概述 网络层主要任务是实习网络互连&#xff0c;进而实现数据包在各网络之间的传输 因特网使用TCP/IP协议栈 由于TCP/IP协议栈的网络层使用网际协议IP&#xff0c;是整个协议栈的核心协议&#xff0c;因此TCP/IP协议栈的网络层常称为网际层 网络层提供…

1.3 金融数据可视化

跳转到根目录&#xff1a;知行合一&#xff1a;投资篇 已完成&#xff1a; 1.1 编程基础   1.1.1 投资-编程基础-numpy   1.1.2 投资-编程基础-pandas 1.2 金融数据处理 1.3 金融数据可视化 文章目录 1. 金融数据可视化1.1. matplotlib1.1.1. 沪深300走势图1.1.2. 日线均线…

D50|单调栈

739.每日温度 初始思路&#xff1a; 暴力解法但是会超时。 class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] answer new int[temperatures.length];for(int i 0;i<temperatures.length;i){for(int j i;j<temperatures.length;j){if(te…

C# 2中的一些小特性

一、局部类型 在C#当中有这样一个关键字partial 用来声明类&#xff0c;结构&#xff0c;接口分为多个部分来声明。使用场景可以一部分类中写实例方法&#xff0c;一部分写属性&#xff0c;我在实际工作测试中就是将属性与实际方法是分开的。相互之间的成员互相通用。 举个例子…

C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry

文章目录 前言反射是什么&#xff1f;常用类型操作SummryPropertyInfoMethodInfo无参函数运行 有参函数运行,获取paramterInfo 总结 前言 我之前写了一篇Attribute特性的介绍&#xff0c;成功拿到了Attribute的属性&#xff0c;但是如果把Attribute玩的溜&#xff0c;那就要彻…