- 博客(48)
- 收藏
- 关注
原创 代码随想录刷题——二叉树篇(五)
上可以不用太重视具体过程,只需要考虑如何。(2)递归法可以把函数本身看作一个循环。(3)迭代法就是层序遍历的板子。(1)二叉树的遍历和操作在。左右节点和中节点本身,需要。
2025-12-22 17:33:48
260
原创 代码随想录刷题——二叉树篇(四)
进行比较,因此入队时只需要考虑将需要比较的两个节点相继放入即可,所以无论是队列还是栈都可以实现,无非是顺序问题,用栈实现。很重要(每种情况从哪条路走通)(这里有 if 和三个 else if ,实际上之后的代码就。(2)bool isSame = outside && inside 这种写法。(3)迭代法实际上相当于是。
2025-12-16 16:40:04
114
原创 代码随想录刷题——二叉树篇(二)
(3)复习一下sort()、reverse()使用方法是用迭代器,比如vec.begin(),vec.end()(end是末尾元素的后一个位置,并不是末尾元素,访问末尾元素应该用*(vec.end()-1)),同时vector还有vec.front()(首元素)、就已经是可知、可处理的了,也就是说按板子来,在遍历的过程中就会按照层序的顺序来依次访问各个节点,(2)按照层序遍历的流程走,各个节点被放到队列queue中后其实其。
2025-11-25 15:55:25
329
原创 代码随想录刷题——二叉树篇(一)
比如前序遍历的迭代方法,就是在循环前先把头节点入栈,然后循环 <节点出栈--左右节点入栈> 的过程。a.或条件while(cur!=NULL ||!st.empty())(3)前序和后序的迭代是类似的,中序的迭代循环写的很精妙,涉及或条件、循环变量。<栈> ,cur不为空就找左指针,cur为空且栈不为空就处理栈。94-144-145.二叉树的前中后序遍历。(2)递归转迭代,通常第一步应该。
2025-10-31 11:32:08
334
原创 代码随想录刷题——二叉树篇(理论)
顺序存储类似数组,通过下标 i*2+1 和 i*2+2 的对应关系来存储。链式存储类似链表,通过数值+指针的方式存储,内存地址不连续。深度优先(又分为前序中序后序)、广度优先(层序遍历)平衡二叉搜索树:左右子树层数差<=1的二叉搜索树。完全二叉树:最底层右侧可未填满。满二叉、完全二叉、二叉搜索、平衡二叉搜索。二叉搜索树:左全小右全大。满二叉树:所有层均填满。2.二叉树的存储方式。3.二叉树的遍历方式。
2025-10-30 14:41:34
212
原创 代码随想录刷题——栈和队列篇(总结)
括号匹配、字符串去重、逆波兰表达式(都是栈最经典的应用)滑动窗口最大值(单调队列)、求前K个高频元素(优先队列)(2)我们使用的stack,queue是属于那个版本的STL?(3)我们使用的STL中stack,queue是如何实现的?(4)stack,queue 提供迭代器来遍历空间么?区分方式:可以容纳的内容,如果只能放。(1)C++中stack,queue 是容器么?就是容器,如果可以放。
2025-10-30 14:02:46
214
原创 代码随想录刷题——栈和队列篇(六)
b.如果push的元素按照规则(本题是second更大)返回true,则继续往后排,第二个输入就变成了队伍中排第二名的元素,直至返回false为止,push的元素也就找到了自己合适的位置。(3)迭代器可以理解为容器的“下标”,因为有一些容器本身不是连续存储的,所以无法像数组一样利用下标访问容器内元素,而迭代器弥补了这一点。容器适配器:需要使用底层容器存储数据,隐藏底层容器的完整功能,提供特定的、受限的接口,比如stack、queue、priority_queue等。的队列,即push进来的元素会自动。
2025-10-29 15:21:13
338
原创 代码随想录刷题——栈和队列篇(五)
私有嵌套类可以访问外部类的公有、私有部分,公有嵌套类只能访问外部类的私有部分,但可以通过声明。私有可以套公有,即嵌套类可以私有,私有类中的方法可以公有。数据结构类可以放到private中,方法函数类可以放到public中。(比如本题中那些不可能成为滑动窗口中最大值的元素),并且。(1)class里可以套class,被称作。的方式来允许特定嵌套类之间的访问。,stack和queue的默认底层容器是。(2)vector的底层实现是独立的。(3)单调队列实际上就是维护元素时。
2025-09-17 17:56:33
307
原创 代码随想录刷题——栈和队列篇(四)
分别是string转int、long、long long、float、double,最常见的就是将string类型的转换成数字。正数部分了,所以正数部分。
2025-09-17 17:09:57
163
原创 代码随想录刷题——栈和队列篇(三)
(2)string类型用size()和length()来获取长度。1047.删除字符串中的所有相邻重复项。s.begin()和s.end()这种。(1)栈最最最经典的题目,就是。(3)reverse()用。两步,刚好完美契合栈。
2025-09-16 22:19:07
163
原创 代码随想录刷题——栈和队列篇(二)
(1)除了string有s.lenght()这个用法之外,其他大多数的STL容器都有的是.size(),对于不想用迭代器的情况下,使用。,因为如果拷贝时发生异常,该值既不在容器中也无法被正确返回。(2)容器有queue<int> qu1,qu2;不支持下标,只能通过。(3)C++STL中大多数容器的。的这种用法,很方便,且是。访问的容器(其中map是用。225.用队列实现栈。
2025-09-10 16:39:26
222
原创 代码随想录刷题——栈与队列篇(理论)
(2)C++中的STL有多个版本,分别是HP STL(开源)、PJ STL(Visual C++使用,未开源)、SGI STL(Linux的C++编译器GCC使用,开源),后两个都是。2.常用的SGI STL在没有指定底层实现的情况下,栈和队列都默认是以deque为缺省情况下栈的底层结构。,list(链表)、vector(数组)、deque(双端队列)都可以是栈的底层实现。,可以用vector、deque、list容器实现。(1)C++中的stack是。,所以STL中栈通常被归类为。来遍历stack空间。
2025-09-08 22:53:36
214
原创 代码随想录刷题——栈与队列篇(一)
(1)stack的默认pop()函数返回void。(2)stack的top()函数很方便。232.用栈实现队列。
2025-09-08 22:52:52
193
原创 代码随想录刷题——字符串篇(七)
去掉首位字符后=“bc abc abc abc abc ab"此时由于自循环的缘故,中间部分一定会出现与原始字符串相同的子串,充分必要性的数学证明网站中有。(1)移动匹配法非常巧妙,相当于把一个字符串写。判断写法,string作用域下的npos。459.重复的子字符串。
2025-08-19 18:52:10
142
原创 代码随想录刷题——字符串篇(六)
(3)函数中参数的写法void getNext(int* next, const string& s),数组用int* next,传入的是vector<int> next 的 &next[0]l 指针指向haystack串的开始,r 指针指向needle串的开始,先匹配首字符,如果匹配失败则 l 右移,匹配成功则进入。,如果匹配则 l 和 r 同时右移,直至 r ==needle.size()或者 l==haystack.size()j 的扩大实际上是在撑大字符串,i 的扩大和回退是在做比较。
2025-08-19 17:52:49
336
原创 代码随想录刷题——字符串篇(四)
(2)去除空格部分一开始使用s.erase()实现的,但是erase本身操作的时候就需要将后面的字符串。,本身时间复杂度就在O(1)到O(N)之间,因此用双指针法时间复杂度更低。c.通常内侧循环要适用于三种情况,b.大循环内的判断通常有。151.反转字符串中的单词。
2025-08-17 21:31:50
185
原创 代码随想录刷题——字符串篇(三)
c. s.resize(s.size()+5*cnt) # 将字符串大小扩容至s.size()+5*cnt。d. s.replace(i,len,"str") # 将字符串。g. s.rfind("str") # 查找子串。f. s.find("str") # 查找子串。b. s.insert(i,"str") # 在。(2)底层实现法先扩容再从后往前填充,为了。的子串替换为“str”字符串。
2025-08-17 16:20:20
189
原创 代码随想录刷题——字符串篇(一)
(1)一开始还担心怎加一个字符串类型变量做交换的中转是否可以,实际上没什么问题。(2)swap函数底层实现就是经典的。
2025-08-16 17:25:21
147
原创 代码随想录刷题——哈希表篇(总结)
(1)哈希表本质上是对遍历过的数据进行映射后保存,便于下次需要(可能是判断、也可能是查询)时快速找到,可以用来优化一个循环,降低一层复杂度。有哈希碰撞的情况存在,因此时间复杂度是。c.map:通常适用于要为遍历过的数据。(3)三数之和、四数之和用双指针法更易理解也更便捷。b.set:通常适用于只想做判断。a.数组:适用于要存的数据值有。数组、set、map。,元素成对(pair类型)存在。
2025-08-16 17:11:27
197
原创 代码随想录刷题——哈希表篇(八)
b.去重在a、b层是为了去掉重复的首、次位数,在c、d层则是为了找到a、b确定下。此时的逻辑为:a被强转为long类型,再与int类型的b、c、d做加法运算,此时b、c、d。a.剪枝主要在判断前,判断a、b层。(3)类型溢出:测试样例中存在计算a+b+c+d。(1)用哈希表也好/双指针法也好,终究只能。
2025-08-16 16:59:39
223
原创 代码随想录刷题——哈希表篇(七)
(2)sort用法:sort(nums.begin(),nums.end()),如果需要可以先对输入进行排序方便处理。(6)双指针法b、c的去重是根据其查找答案的时候来的,在查找b、c时,由于指针一左一右,先找到的答案一定在。这两个点,遮住a的部分只看b、c的话基本上就是。(5)双指针法也是建立在排好序的基础上,,所以找到一组答案后,循环向后找让b的值。或者类似的方法害怕超过边界的时候直接放到。(1)很多时候用set、map相当于是。(4)这道题本质上是通过。同时,由于数组有序,(3)本题只需要判断。
2025-08-16 10:55:58
160
原创 代码随想录刷题——哈希表篇(五)
(1)本质上还是利用map的特点对已经处理过的数据进行“(2)本题如果暴力的话时间复杂度就是。,使用map后就降到了最低。
2025-08-14 16:21:37
163
原创 代码随想录刷题——哈希表篇(四)
来确定具体类型,如果函数返回值是vector<int>,那么{1,2,3}就是vector<int>,如果是array那就是array,甚至也可以是自定义的结构体类型。d.unordered_set和unordered_map底层哈希表实现,平均复杂度为O(1)最坏O(N)所以本题平均复杂度为O(N)*O(1)=O(N),最坏为O(N)*O(N)=O(N^2)(2)map查谁用谁做下标(key)
2025-08-14 11:49:59
237
原创 代码随想录刷题——哈希表篇(三)
(1)类似模拟题,一开始写的renum函数返回的是vector<int> 也就是每个位上的值,然后在while循环里进行加的操作,这样会增加额外空间开销,且每个位上的数没有什么用,所以直接返回加和的结果即可。
2025-08-14 10:52:25
134
原创 代码随想录刷题——哈希表篇(二)
greater<int>(降序,大的在前)、less<int>(升序,小的在前))(首个不小于、 首个大于、 等于的匹配范围)(1)vector<int> nums1;C++中vector只有size(),此时it不是迭代器,而是容器中的具体元素。都有迭代器begin()和end(),除了。自动推导变量类型,可以替换掉比较。,可以通过括号()的方式调用),不会增加拷贝,也无法修改元素。另外auto还可以直接推导。平均O(1)最坏O(N)
2025-08-13 22:39:05
747
原创 代码随想录刷题——链表篇(总结)
(3)删除倒数第N个节点:维护一个长度为n+1的。(2)反转链表:双指针相邻,一前一后。(5)环形链表:模拟找入环点。(4)链表相交:获取长度后。(1)虚拟头节点用于解决。
2025-08-11 11:48:10
107
原创 代码随想录刷题——链表篇(七)
也就是说此时再找一个指针pre从链表首一次走1步走到入环点(等式左侧,相当于走了a步),slow指针从相遇点同时出发,刚好也会走到入环点(等式右侧,相当于先走了c步到入环点,又走了n-1整圈还是回到入环点)。紫色点即为假设的快慢指针相遇点,a为宿舍到操场的距离,b为慢指针在操场跑的距离,c为相遇点距环入口距离。,根据小学二年级的追赶知识,二人肯定会在操场内相遇(即在环内相遇)(因为入环时间不同的前提下,只有速度相同才不会相遇)。才能追上慢指针(即在两圈终点追上),一旦二者先后入环,快指针必定会在慢指针。
2025-08-10 22:04:53
369
原创 代码随想录刷题——链表篇(六)
(1)类似于模拟题,链表相交指的是地址相同,也就是两个链表中间节点next。,从该节点往后两个链表共用相同的内存空间。的方式简化if-else需要写两遍的问题。,再从前往后找第一个相同的即可。面试题 02.07.链表相交。(2)所以只需要让两链表。
2025-08-10 17:02:31
129
原创 代码随想录刷题——链表篇(五)
(1)相当于在链表首维护一个n+1大小的。指向的就是需要操作的节点的前一个节点。的方式可以规避掉很多边界问题的麻烦。19.删除链表的倒数第N个节点。,然后同时移动快慢指针让。
2025-08-10 16:40:04
188
原创 代码随想录刷题——链表篇(四)
(2)链表模拟可以用虚拟头节点来做,通常会好做一些,先设置一个虚拟头节点hhd->next指向head,再设置一个用于迭代的itr=hhd。(1)指针也是变量,除了new需要担心内存,ListNode* node_1 = hhd这种声明方式不用担心。24.两两交换链表中的节点。
2025-08-10 15:55:40
118
原创 代码随想录刷题——链表篇(三)
(1)就是找一个变量存储一下next指向的地址,防止next指向反转后地址丢失,然后这个变量是个指针(和两变量互换 c=b;a.考虑最后一层(结束的场景,一般是一个if() return;,其余层都是递归函数的返回值,正常的递归函数返回值就是最后一层的返回值。a.考虑边界条件(head==NULL和结束场景)c.观察完返回值后考虑如何操作(考虑操作时看。b.考虑下一层递归(这个时候要考虑到。b.考虑其中一层如何操作。c.考虑操作后用哪些。(2)递归本质上就是。
2025-08-09 21:32:28
317
原创 代码随想录刷题——链表篇(二)
b.再准备“原材料”(比如LinkNode* newNode = LinkNode(val)和LinkNode* itr = _hhd)_size-1 _size。虚拟头节点-->头节点-->正常节点-->尾节点-->NULL。(7)注意:双链表版本删除最后一个节点时oldNode->next==NULL。(3)_size是节点个数,_size-1是遍历下表总长度。(4)while(indxe--)可以认为是代表“d.考虑私有变量(可以认为是“”)是否需要变化(比如_size++)
2025-08-07 16:22:28
259
原创 代码随想录刷题——链表篇(一)
(2)Solution()这种实在栈内存上创建对象,栈自动管理,出了声明的作用域就被自动清除了(调用析构函数)。(1)new、delete是在堆内存上创建对象,new创建后必须delete才能清除,可以跨作用域存在。比如函数要返回一个函数内声明的对象的时候得是这个。(2)局部、临时、小数据优先栈内存,大数据、动态数据结构(比如二叉树)、需跨域存在的数据优先堆内存。4.class和struct本质上都是对象,但权限不同,通常class装大的,struct装小的。(1)栈内存自动管理,堆内存程序员管理。
2025-08-06 11:46:05
138
原创 代码随想录刷题——链表篇(理论)
head节点比较重要,可以简化很多操作。分为:单链表、双链表、循环链表。数组插入(删除)n,查询1。链表插入(删除)1,查询n。
2025-08-06 10:32:54
155
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
4