自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(209)
  • 收藏
  • 关注

原创 C++十大排序算法

计数排序的时间复杂度为 O(n + k),其中 n 是待排序元素的数量,k 是数据的范围大小。桶排序(Bucket Sort)是一种分布式排序算法,它将待排序的元素分配到若干个桶(Bucket)中,然后对每个桶中的元素进行排序,最后将所有桶中的元素按顺序合并。冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。选择排序基本思想是每次从待排序的数据中选择最小(或最大)的元素,放到已排序序列的末尾,直到全部数据排序完成。

2025-10-27 22:16:28 1099 1

原创 C++特性之构造函数,析构函数和虚析构函数

一种特殊的成员函数,在对象被销毁时自动调用,常用于清理资源如开辟的空间等。一种特殊的成员函数,在创建对象时自动调用。资源管理 idiom,是编写安全、无泄漏的C++代码的关键。获取资源(内存、文件、网络连接等),利用。:所有资源都被正确释放,没有任何泄漏。

2025-09-20 21:46:02 240

原创 C/C++关键字——union

它的主要目的是节省内存,尤其是在处理多种可能的数据类型,但一次只使用其中一种的场景。这意味着,你给一个成员赋值,会覆盖其他成员的值(因为它们都使用相同的内存起始地址)。一个联合的大小至少等于其最大成员的大小,以确保能容纳下任何一个成员。(结构体)不同,结构体的每个成员都拥有自己独立的内存空间,而联合的所有成员都。是一种特殊的数据类型,它允许你在。

2025-09-04 15:02:05 424

原创 15、C++算法之代码随想录(贪心算法)——监控二叉树

如果要使用最少,应该从叶子结点往上遍历,在其父节点安装摄像头。给定一个二叉树,我们在树的节点上安装摄像头。计算监控树的所有节点所需的最小摄像头数量。节点上的每个摄影头都可以监视。

2025-07-30 10:43:02 209

原创 14、C++算法之代码随想录(贪心算法)——单调递增的数字

从后往前遍历,如果存在前一个大于后一个的,前面减1,后边变为9,这样保证即小于n同时又单调递增且最大。当且仅当每个相邻位数上的数字。的最大数字,且数字呈。时,我们称这个整数是。

2025-07-30 10:34:56 250

原创 14、C++算法之代码随想录(贪心算法)——划分字母区间

合并重叠区间,首先对数组进行左或右排序,判断边界是否重叠,如果重叠,就合并区间的左右端点。如果不重叠就直接添加进结果容器中。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2025-07-30 09:10:35 254

原创 13、C++算法之代码随想录(贪心算法)——划分字母区间

我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。找到相同字母对应的最远区间,然后进行分割即可。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是。返回一个表示每个字符串片段的长度的列表。

2025-07-29 22:36:56 172

原创 12、C++算法之代码随想录(贪心算法)——无重叠区间

如果区间存在部分重叠,一定会用到两者的左或右端点。可以对区间进行右端排序,那么右端点小于左端点的区间是不是就没有重叠部分,统计没有重叠的区间,在用数组长度减去不重叠的就是要移除的区间数量。需要移除区间的最小数量,使剩余区间互不重叠。移除 [1,3] 后,剩下的区间没有重叠。只在一点上接触的区间是。

2025-07-29 21:57:20 274

原创 11、C++算法之代码随想录(贪心算法)——用最少数量的箭引爆气球

若两个区间部分重叠一定会包含区间的左端点或右端点,那么就可以用这两个端点来判断区间是否存在部分重叠。按照左端点对区间进行排序,然后比较前一个区间右端点和后一个区间的左端点,判断是否重叠,并找到最小的右端点。有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组。处射出一支箭,若有一个气球的直径的开始和结束坐标为。你不知道气球的确切 y 坐标。弓箭一旦被射出之后,可以无限地前进。一支弓箭可以沿着 x 轴从不同点。返回引爆所有气球所必须射出的。可以射出的弓箭的数量。

2025-07-29 21:37:44 359

原创 10、C++算法之代码随想录(贪心算法)——根据身高重建队列

一共需要考虑两个维度信息,因此先确定一个维度,在考虑另一个维度。将数组先按照身高进行排列,然后再按照第二个参数由高到低进行插入。(因为高的不会受低的影响)表示队列中一些人的属性(不一定按顺序)。返回的队列应该格式化为数组。假设有打乱顺序的一群人站成一个队列,数组。请你重新构造并返回输入数组。是排在队列前面的人)。

2025-07-29 17:41:12 203

原创 9、C++算法之代码随想录(贪心算法)——柠檬水找零

我们只需要维护三种金额的数量,5,10和20。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付。如果你能给每位顾客正确找零,返回。顾客排队购买你的产品,(按账单。在柠檬水摊上,每一杯柠檬水的售价为。每位顾客只买一杯柠檬水,然后向你付。注意,一开始你手头没有任何零钱。支付的顺序)一次购买一杯。模拟这三种情况进行求解即可。

2025-07-29 17:08:30 331

原创 8、C++算法之代码随想录(贪心算法)——分发糖果

先确定右边评分大于左边的情况(也就是从前向后遍历)此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。局部最优可以推出全局最优。再确定左孩子大于右孩子的情况(从后向前遍历)。保证左边的孩子比右孩子多一个糖果,取两次遍历的最大值保证第i个小孩的糖果数量既大于左边的也大于右边的。请你给每个孩子分发糖果,计算并返回需要准备的。表示每个孩子的评分。

2025-07-29 16:53:39 264

原创 7、C++算法之代码随想录(贪心算法)——加油站

情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。你从其中的一个加油站出发,开始时油箱为空。

2025-07-29 10:55:17 203

原创 6、C++算法之代码随想录(贪心算法)——K次取反后最大化的数组和

首先按照绝对值大小对数组进行排序,然后遍历数组将值为负数的元素进行翻转,最后检查K是否为0。如果K为偶数,可以直接返回数组之和,如果K为奇数,将最后一个元素翻转后累加返回即可。以这种方式修改数组后,返回数组。可以多次选择同一个下标。

2025-07-28 13:59:18 277

原创 5、C++算法之代码随想录(贪心算法)——跳跃游戏I、II

求最小跳跃次数,我们需要获得当前最大跳跃范围与下一次的最大跳跃范围,然后当移动到前一次的最大范围时,跳跃次数加1,并更新当前最大跳跃范围。如果范围大于数组长度,返回跳跃次数。获取当前位置的最大移动范围,在这个范围内移动,记录能够移动的最大范围,最后与数组长度进行比较,若大于数组长度,说明可以移动到最后。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回。

2025-07-24 12:10:39 149

原创 4、C++算法之代码随想录(贪心算法)——买卖股票的最佳时机II

随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。求最大利润,只需要找到相邻两天利润为正的天数,将这些利润相加即为最大利润。在每一天,你可以决定是否购买和/或出售股票。最大总利润为 4 + 3 = 7。你也可以先购买,然后在。

2025-07-23 12:28:51 243

原创 3、C++算法之代码随想录(贪心算法)——最大子序列之和

求最大连续子序列,只需要遍历这个数组,然后进行累加,记录最大值,如果累加和小于0,就从当前位置重新开始累加。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。连续子数组 [4,-1,2,1] 的和最大,为 6。是数组中的一个连续部分。

2025-07-22 22:21:20 255

原创 2、C++算法之代码随想录(贪心算法)——摆动序列

保证数组前后两数之间的差值为一正一负,基本思路就是遍历整个数组计算前后两个数的差值,进行判断即可。2、数组只有两个数字时,由于计算两个差值需要三个数,只有两个数时,假设最前面额外多一个数与第一个数相同,此时前差值为0。仅有一个元素或者含两个不等元素的序列也视作摆动序列。可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)。如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为。

2025-07-22 21:40:54 249

原创 1、C++算法之代码随想录(贪心算法)——分发饼干

摘要:LeetCode 455题"分发饼干"要求用给定尺寸的饼干满足尽可能多的孩子。贪心算法通过将饼干和孩子按大小排序,优先用大饼干满足大胃口孩子来实现最优解。代码先排序两个数组,然后从后向前遍历,匹配满足条件的饼干和孩子,统计最大满足数量。示例输入g=[1,2,3],s=[1,1]时输出为1。

2025-07-21 19:44:44 312

原创 14、C++算法之代码随想录(回溯算法)——解数独

遍历这个二维数组,在空白处填上1-9之间的数字,遍历的深度就是数组中需要填的空白个数,遍历的宽度就是1-9。再对填入的值进行判断即可。编写一个程序,通过填充空格来解决数独问题。数独部分空格内已填入了数字,空白格用。

2025-07-21 16:08:09 415

原创 13、C++算法之代码随想录(回溯算法)——N皇后

在一个二维空间放置n个棋子,并且需要满足三个条件:不能同行,不能同列,不能同一斜线。使用回溯法进行求解,行代表变量的深度,列代表遍历的宽度,在判断一下当前点是否满足即可。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。的棋盘上,并且使皇后彼此之间不能相互攻击。的棋子放置方案,该方案中。每一种解法包含一个不同的。分别代表了皇后和空位。

2025-07-21 15:37:32 335

原创 12、C++算法之代码随想录(回溯算法)——全排序II

包换重复数字的全排列,在数组全排列的基础上,增加去重即可。这里去重依旧是对数组进行排列,然后用一个bool类型的数组作为标志位判断相邻元素是否相同且在同一层使用。给定一个可包含重复数字的序列。返回所有不重复的全排列。

2025-07-19 11:42:26 182

原创 11、C++算法之代码随想录(回溯算法)——全排序

对数组进行全排序,其实就是数组组合问题,只不过限制组合与数组大小相等,且元素不能重复。如何保证元素不重复使用,使用一个bool类型的数字作为标志位进行判断即可。给定一个不含重复数字的数组。

2025-07-19 11:02:10 157

原创 10、C++算法之代码随想录(回溯算法)——递增子序列

求递增子序列,与求数组子集方法类似,只需额外判断是否递增即可。而去重方式则与前边使用的方式不同,因为不能对数组进行排序,所以使用set来判断当前元素在同一层是否使用过。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。,找出并返回所有该数组中不同的递增子序列,递增子序列中。

2025-07-19 10:43:34 222

原创 9、C++算法之代码随想录(回溯算法)——子集II

求数组子集,但是不能有重复的,求数组子集就是求所有节点,去重操作与数组组合去重一样,对数组排序,使用一个bool类型数组作为标志位判断相邻的相同元素是否为同一层,如果为同一层跳过遍历即可。,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。返回的解集中,子集可以按。

2025-07-19 10:16:14 150

原创 8、C++算法之代码随想录(回溯算法)——子集

求数组子集,这个问题和求数组组合是类似的,但求数组组合只求叶子节点,而求数组子集要求所有节点。求所有节点,只需每次遍历前把当前节点存入结果集即可。其他部分依然按照回溯模版写。返回该数组所有可能的子集(幂集)。

2025-07-19 09:54:13 230

原创 7、C++算法之代码随想录(回溯算法)——复原IP地址

复原IP地址,其实就是往字符串中插入三个点来分割字符串,然后判断各部分是否符合IP地址的标准。分割字符串前面已经介绍过了,按照回溯的模版写。,用以表示一个 IP 地址,返回所有可能的。正好由四个整数(每个整数位于。之间组成,且不能含有前导。给定一个只包含数字的字符串。,这些地址可以通过在。

2025-07-19 09:43:28 126

原创 6、C++算法之代码随想录(回溯算法)——分割回文串

分割字符串和数字组合问题本质是相同的,这题只需额外判断下是否为回文串即可。分割成一些 子串,使每个子串都是。所有可能的分割方案。

2025-07-18 19:14:09 260

原创 5、C++算法之代码随想录(回溯算法)——组合总和II

数组中数字只能使用一次,但数组中可能存在重复的数字,那么这些重复的数字在一个组合中可以使用,但在不同的组合中就应该剪去防止出现重复的组合。如何剪去这些重复的数字,代码随想录使用一个bool类型的数组进行判断,示意图如下。对这个数组进行排序,比较当前数字和前一位数字是否相同。相同的话,看标志位数组的值。为false说明这两个值为同一层,应该舍去,为true说明是一个分支的。中的每个数字在每个组合中只能使用。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。

2025-07-18 17:38:56 334

原创 4、C++算法之代码随想录(回溯算法)——组合总和

使用回溯法进行求解。由于组合没有限制,所以遍历的层数不是固定的,遍历的宽度由数组长度决定。3.处理逻辑——for循环遍历数组,计算总和,记录数值,回溯。1.函数参数——给定的数组,目标值,遍历值之和,遍历的下标。2.终止条件——当遍历值之和大于等于目标值时停止。如果至少一个数字的被选数量不同,则两种组合是不同的。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。

2025-07-17 22:11:55 339

原创 3、C++算法之代码随想录(回溯算法)——电话号码的字母组合

给定一个字符串,输出数字对应字母的所有组合。字符串的长度代表遍历的层数,数字对应的字母个数代表遍历的宽度。为了方便数字和字母的对应,创建一个字符串数组进行映射。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。的字符串,返回所有它能表示的字母组合。

2025-07-17 21:45:45 310

原创 2、C++算法之代码随想录(回溯算法)——组合总和

在1-9之间找K个数,满足和为n。那么K就代表搜索的深度,1-9代表搜索的宽度。该列表不能包含相同的组合两次,组合可以以任何顺序返回。使用回溯法进行遍历即可。所有可能的有效组合的列表。

2025-07-17 10:51:36 277

原创 1、C++算法之代码随想录(回溯算法)——组合问题及优化

使用回溯法求解该问题其结构类似于树。层数代表递归的次数由k控制,每层的节点数由n控制。

2025-07-16 19:28:54 353

原创 28、C++算之代码随想录(二叉树)——将二叉搜索树转化为累加树

从后往前累加树的节点,根据题目要求,按照右中左的顺序遍历二叉搜索树,使用一个变量记录前一个节点的值进行累加即可。(BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。

2025-07-16 16:23:39 294

原创 27、C++算之代码随想录(二叉树)——将有序数组转化为二叉搜索树

构造二叉搜索树,就是不断的找分割点,将区间划分为两个部分,直到区间长度为0。对于有序数组,一般都是取中点作为根节点。排列,请你将其转换为一棵 平衡 二叉搜索树。

2025-07-16 12:16:30 188

原创 26、C++算之代码随想录(二叉树)——修剪二叉搜索树

删除给定区间外的节点,需要遍历二叉搜索树,然后碰到区间外的节点需要递归判断其左右子树是否有位于区间内的节点,然后将节点返回。改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。通过修剪二叉搜索树,使得所有节点的值在。给你二叉搜索树的根节点。

2025-07-16 11:11:18 451

原创 25、C++算法之代码随想录(二叉树)——删除二叉搜索树中的节点

删除指定节点,首先需要遍历二叉搜索树,从上往下遍历使用中序遍历,然后节点删除分5种情况。5.左右节点都不为空,删除该节点,将左节点放到右节点的最左侧节点下(二叉搜索树的性质)。对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。2.找到节点且左右子节点都为空,直接删除该节点,返回nullptr;3.找到节点左节点为空,右节点不为空。删除该节点,返回右节点。4.找到节点左节点不为空,右节点为空。删除该节点,返回左节点。给定一个二叉搜索树的根节点。,删除二叉搜索树中的。

2025-07-15 21:27:50 640

原创 24、C++算法之代码随想录(二叉树)——二叉搜索树中的插入操作

由于二叉搜索树的特性,只需要递归比较节点值和插入值的大小,找到空节点插入即可。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。,新值和原始二叉搜索树中的任意节点值都不同。给定二叉搜索树(BST)的根节点。

2025-07-15 19:27:44 254

原创 23、C++算法之代码随想录(二叉树)——二叉搜索树的最近公共祖先

根据二叉搜索树的特点可知,两个节点的公共祖先一定在两个节点值组成的区间内。如何求最近公共祖先,只需要从上往下遍历,找到的第一个位于区间内的节点即为最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

2025-07-15 10:49:40 247

原创 22、C++算法之代码随想录(二叉树)——二叉树的最近公共祖先

中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(求两个节点的最近公共祖先,可以看如下示意图,利用回溯求解。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。的最近公共祖先是节点。

2025-07-15 09:00:53 384

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除