自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 问答 (2)
  • 收藏
  • 关注

原创 【数据结构】二叉树堆排序,TopK详解(第二章)

🎆前言🎆✨笔者也仅是大一萌新,写博客为了记录和巩固知识✨🥰赠人玫瑰,手留余香,欢迎各位读者进行交流和建议🥰🌹能与大家一起学习,一起进步是我的荣幸🌹🤞如果这篇文章有帮助到您,还请留个赞支持一下哦🤞🎃前情提要🎃🎁二叉树第一章——初识二叉树🎁🔎目录:🔎二叉树的顺序结构🔎堆的概念和结构🔎实现堆的方法⭐建堆的时间复杂度⭐函数声明⭐交换函数⭐打印函数⭐初始化⭐清空函数⭐插入函数⭐向上调整法⭐删除函数⭐向下调整法⭐根结点,树的大小,判空三合一🔎实现堆排序.

2022-04-15 14:15:30 1782 27

原创 牛客 226303 【模板】差分

本篇将对差分算法进行基本认识,差分算法是一种通过(差分)来优化计算或解决问题的策略,核心思想是通过,从而简化计算或提升效率。构建差分数组diff,其中。对区间[L, R]增加k(若存在)。通过,此时由于从L开始增加了k,还原后依然增加k,R+1之后减去k,则之后的元素将会还原,时间复杂度降为O(1)单次操作。

2025-04-08 18:23:43 195

原创 LeetCode 面试题 17.19. 消失的两个数字

运用,我们先创建一个变量tmp,nums和1~N所有整数,此时就可以得到两个数的异或值。然后通过,逐位检查tmp中的每一位,找到第一个为1的位,用diff变量存储起来,表示两个数字的的(一个为0,一个为1,异或以后必定为1)。由此我们可以分组,10,分别对这两组数字与nums进行异或操作,得到两个的数字。再将这两个数字与1~N异或起来,而nums中的数字一定会出现两次,则相同数字异或结果为0,最后就可以得到两个缺失的数字。

2025-03-03 19:42:12 354

原创 【C++第二十章】红黑树

enum Color //定义颜色枚举,增加可读性RED,BLACK//一样的使用三叉链,方便旋转//左孩子//右孩子//父节点//这里使用的是KV模型Color _col;//颜色, _kv(kv), _col(RED) //默认设置为红色,如果默认为黑色,则每次插入必定违反性质4{}

2025-02-20 22:25:36 1500

原创 【Linux第二章】Linux内核与权限

Linux内核与权限

2025-02-10 16:18:22 20984

原创 【C++第十九章】AVL树

在AVL树定义中,我们使用了三叉链,尽管多开了一个指针,但是大大减少了程序的复杂度,插入时可以快速找到父节点从而进行平衡因子判断、调整。template<classK,classV>//KV模型//左孩子//右孩子//父节点int_bf;//平衡因子,_kv(kv),_bf(0){}当以parent为根的子树不平衡,即parent平衡因子为2或者-2,需要分以下情况考虑:parent的平衡因子为2,则右子树高,设parent的右子树的根为SubR当SubR平衡因子为1时,执行。

2025-01-19 19:42:39 1151

原创 LeetCode 704.二分查找

在本篇以及之后几篇的博客中,博主将会用二分法进行解答,以此巩固二分题型。二分法一般用于具有的数据中使用。比如该题为有序数组,需要我们查找一个目标值target,分析后发现,这段数据中会出现,大于target,小于target,等于target,而等于target是我们的目标,于是可以判断出,这个数组是具有二段性的,,由此得出使用二分法。我们以下面数组进行举例,首先求出一个中间值,这里我使用,在某些情况下,,具体在之后的篇章中会进行说明。

2024-12-18 22:30:47 590

原创 LeetCode 904.水果成篮

求水果的最大数目,也就是求最大长度,我们是单调的向前求解,则能够想到使用进行解答,可以用,且都从起点开始。右边框先走,当种类个数为0时,表示这是个新种类,kinds++,当kinds大于2,则不满足题意,需要,再,当种类个数为0时,旧种类删减完成,继续移动右边框,重复该过程并每次循环都算一下长度,直到right走到尾结束。

2024-12-18 22:29:35 427

原创 LeetCode 438.找到字符串中所有字母异位词

需要找到子串异位词,也就是只看该子串是否有相同字母而不管位置是否相同。分析题目发现只需要单调向前找异位词,则可以使用求解,注意这里每当,并且异位词可以用哈希表进行判断:定义两个哈希表,一个s的哈希表,一个p的哈希表。通过分析题目,异位词不严格要求一一对应,则,我们可以再定义一个count,当插入时,,count++;删除时,,count–。最后,当count == len时,表示该子串中找到了异位词,将left插入到vector中即可。

2024-12-03 11:35:38 376

原创 LeetCode 1658.将x减到0的最小操作数

分析该题,要求在数组左右两边依次找到几个值,这几个值的和减去x为0,且要个数要最少。我们可以用的方法进行解答,先将,得到的值就是我们需要求的。定义左右两个指针在起始位置,,直到ret

2024-11-21 14:44:29 304

原创 【Linux第一章】Linux介绍与指令

操作系统是一款进行软硬件资源管理的软件。我们编写的程序通过操作系统访问了硬件(printf)。一个文件没有内容,但是有修改日期,类型,大小,文件名,这些是文件的属性,属性也是数据,所以就算没有内容也会占用空间。所以文件 = 内容 + 属性,本质都是数据,在磁盘或者硬盘保存,所以文件的操作无非是对内容的操作,对属性的操作。Linux下一切皆文件。对于文件,以开头的文件,它是隐藏文件。对于目录,是当前目录是上级目录。指令本质是可执行程序(C、C++写的)。

2024-11-18 17:41:18 1772 1

原创 LeetCode 1004.最大连续1的个数III

如示例1所示,我们可以翻转0来得到一个最大长度,那么我们可以用来解决,遇到1时不做判断,,直到计数器小于K时,再次移动右指针,并且每次都计算长度,当这样遍历完整个数组后,就可以得到一个最大值。

2024-11-18 17:33:05 232

原创 LeetCode 209.长度最小的子数组

该题可以用进行解答,滑动窗口的意思是,我们判断一段区间的情况,再根据不同情况进行区间的更新。这里要求满足总和大于等于target的子数组,那么我们可以用两个指针当做左区间和右区间,再用个sum变量统计该区间的和。,然后继续判断。

2024-11-14 09:14:35 332

原创 LeetCode 3.无重复字符的最长子串

使用,哈希表映射每一个字符串,左右指针表示当前区间,当出现一个字符串那么就将哈希表+1,右指针移动,当哈希表对应位置大于1时,表示重复出现了,左指针移动,然后哈希表对应位置-1,最后再计算距离。

2024-11-11 21:51:08 445

原创 LeetCode 18.四数之和

由题意得,四个数组里面的整数相加需要得到target这个目标值,且,那么我们可以用的方式进行解答,将该数组变为,然后,从第二个固定的数下一位开始创建一个left指针,数组结尾创建一个right指针。创建好指针后,我们将target减去固定的两个数得到变量ret,这样只需要考虑两个指针相加是否等于ret。此时两个指针相加有。

2024-10-24 23:22:52 523 2

原创 LeetCode 611.有效三角形的个数

有效三角形的判断方法为两边之和大于第三边,所以我们可以先对该数组进行,再对其进行判断。假如我们以,那么先将4固定住,左指针在第一个数,,那么我们首先判断左右指针相加情况,此时大于4,而该数组有序排列,所以可以得出,可以用right-left统计该区间所有有效组合,最后right–继续判断。当right走到2时,left+right<4,,则该区间没有有效组合,可以直接left++,不再关注right往左的情况。

2024-10-23 10:35:27 617

原创 LeetCode 11.盛最多水的容器

可以用的方式,左右两边分别定义一个变量,都往中间走,相遇停止,中间不断更新最大容积,而选出来的最大值就是最大容积。这里容积的计算方式为,左右两个边选出。我们用对撞指针判断,原理是当指针向中间走时,底边一定是越来越短的,而更短的那个边容积一定更小,所以需要淘汰,每次都更新最大容积,直到左右指针相遇,所选出来的容积就是最大值。

2024-10-18 16:16:15 406

原创 LeetCode 202.快乐数

用来进行解答,可以将其看做一个,当快慢指针相遇时,判断快慢指针是否为1(为1以后无论怎么取平方和都会为1),如果为1就是快乐数,否则不是。

2024-10-17 19:38:06 402

原创 【C++第十八章】Map和Set

map和set讲解

2024-10-10 15:20:59 1066

原创 【C++第十七章】二叉搜索树

二叉搜索树

2024-10-06 12:45:46 723

原创 LeetCode 692.前K个高频单词

首先用map存储该字典,然后放进vector进行排序,注意sort的排序规则与我们想要的规则不一致,所以我们需要写一个伪函数来判断second(value值),由于该题要求了稳定性,所以我们在伪函数还需要继续判断相等情况的顺序。排完序后用vector将前k个单词存储起来返回。

2024-09-13 16:27:12 480

原创 牛客JZ36 二叉搜索树与双向链表 C++

由图所示,我们看出该链表走的是中序,所以我们可以使用的方式来解决这个问题,在遍历过程中,我们创建一个,来进行链接。并且,我们需要判断前驱结点的情况,不然当走到空时,再链接就会发生错误,当,否则直接回到后继结点,不进行操作。

2024-09-08 22:29:39 401

原创 LeetCode 236.二叉树的最近公共祖先

那么我们可以根据情况判断,需要用到,root为当前所开始的结点,p、q为需要寻找的结点。当p、q有一个等于root时,可以直接返回root。当p、q分布在两边时,我们可以用一个函数判断,去。,我们需要将,最后出现时,返回root结点,该结点为最近公共祖先。如果,那么需要去。不过这种方式时间复杂度会很高,因为有树全偏向一边的情况。

2024-09-06 18:32:17 583 2

原创 LeetCode 105.从前序与中序遍历序列构造二叉树

由题,,那么我们可以进行第一次判断——根为3,左子树为9,右子树为15,20,7。可以利用递归,进行每个结点的判定,比如右子树为15,20,7,而前序顺序为20,15,7,所以可以判断右子树根为20,再一次用中序得出左子树为15,右子树为7,以此类推…我们可以用rooti(中序数组下标)来,由此反复递归直到整棵树遍历完,就能够构造一颗二叉树了。

2024-09-04 22:28:03 448

原创 LeetCode 606.根据二叉树创建字符串

根据示例发现,当,因为分不清到底是左为空还是右为空,所以我们在解题时需要判断结点的左右情况。题目要求(根左右),我们可以用传并赋给str,。然后开始走左边,这里要判断一下,如果那么我们就需要,当走到空或者函数走完时就回到上一次递归,开始遍历右边,右边只需要判断是否为空,不为空就进行递归。当遍历完该树后,str就是前序字符串。

2024-09-04 22:10:15 463

原创 LeetCode LCR088.使用最小花费爬楼梯

动态规划

2024-09-03 18:29:17 1222 1

原创 【C++第十六章】多态

多态讲解

2024-09-03 18:27:27 1727 2

原创 牛客 BC153数字统计 C++

用枚举+数字拆分的方式,模10取到该位数字,除10去除该位数字,再取模拿到下一位数字。for循环对L到R的每个数字进行拆分,如果拆出来的数字为2就++一次ret。

2024-08-29 14:54:40 254

原创 牛客 点击消除 C++

可以用的思路,但我们这里用,创建一个str为输出字符串,s接收字符串,然后开始对比,如果str的尾部(可以说是栈顶)与遍历到的接收字符串相等,那么就删除(出栈),否则插入(入栈),当s遍历完成,str就是最终消除的结果。

2024-08-29 14:37:14 402

原创 牛客NC313 两个数组的交集 C++

用哈希表存储第一个数组,再和第二个数组对比,对比成功就添加到新的数组中,再将哈希表的该位置变为false,防止重复添加。这里数据范围仅有1000,所以我们可以自己创建一个bool数组来当哈希表,节省new的时间。

2024-08-28 16:32:14 210

原创 【C++第十五章】继承

尽量不要设计多继承,且一定不要设计出菱形继承,这样会在复杂度和性能上存在问题。多继承可以说是C++设计缺陷之一,java中就没有多继承。public继承是is-a的关系,组合是一种has-a的关系。优先使用对象组合,而不是类继承。继承允许你根据父类的实现来定义子类的实现,这种通过生成子类的复用通常被称为白箱复用。“白箱”是相对可视性而言:在继承方式中,父类的内部细节对子类可见,继承一定程度破坏了父类的封装,父类的改变,对子类有很大的影响。父子类依赖关系很强,耦合度高。

2024-08-27 14:07:11 2129

原创 【C++第十四章】进阶模板

如下面的代码,声明和定义不在同一文件中,func函数能够正常使用,Add函数不能正常使用,这是因为在编译时,对func生成了汇编指令,在链接时能够找到func的地址。但是对于Add,编译器此时不确定Add的T到底是什么类型,所以没有生成汇编指令,从而导致链接时就找不到Add的地址。解决方式有两种,第一种是显示实例化,让编译器在编译时就知道Add是什么类型,能够进行实例化。不过这种方法限定了类型,还不如用重载。第二种是声明定义写到一个文件中,这样预处理时展开头文件声明和定义都有了,就能够确定类型了。模板。

2024-08-23 21:43:41 454

原创 【C++第十三章】Stack、Queue和Priority_Queue

stack、queue和priority_queue都是,它们不用自己管理数据,而是让其他容器管理,自己。适配器指的是一种(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。stack和queue不支持迭代器,因为会。queue也不适配vector,因为结构不匹配。

2024-08-19 17:05:03 1161

原创 LeetCode 19.删除链表的倒数第N个结点 C写法

我们先创建一个哨兵位,这样便于我们头删,然后利用,一个指针(带哨兵位要多走一步),然后,当先走的指针结束,那么后走的指针下一个就是我们要删除的结点,最后用新的头结点接收即可。

2024-08-10 23:03:28 470

原创 【C++十二章】List

list的sort默认是升序(less),如果要排降序需要用到仿函数greater。由于list的sort效率不如vector(list底层是归并,vector是快排),所以当数据量很大时,我们可以将数据拷贝到vector,排完序再拷回来,效率会得到提高。

2024-08-10 22:08:18 910

原创 LeetCode 150.逆波兰表达式求值

用,如果,当整个字符串遍历完后,栈顶值就是该表达式的值。

2024-08-09 14:31:30 367

原创 LeetCode 102.二叉树的层序遍历 C++

用,要获取每层结点个数,可以创建一个变量levelsize,读取队列所存储的结点个数。

2024-08-06 22:51:15 297

原创 牛客 JZ31.栈的压入,弹出序列 C++写法

创建一个栈,push压入序列,然后用,如果,直到压入序列走完,如果栈为空了就说明匹配成功,否则失败。

2024-08-06 22:50:27 301

原创 LeetCode LCR147.最小栈

建立两个栈,一个栈正常入栈出栈,一个栈,当push值小于minst栈顶才入栈,当pop值等于minst栈顶才出栈。

2024-08-05 09:56:55 274

原创 【C++第十一章】Vector

vector是表示,它类似于数组,但大小可以动态改变,并且大小会被容器自动处理。本质上说,,为了减少扩容代价,vector会分配额外空间进行元素存储。对比其他动态序列容器,,可以将其看为一个进行理解。

2024-08-05 09:55:39 1276

空空如也

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

TA关注的人

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