![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode刷题
最爱榴莲糖
这个作者很懒,什么都没留下…
展开
-
【LeetCode】102.二叉树的层序遍历
size记录的是该层节点的个数,vec将每一层节点放进去,最后一层while循环结束后,再将vec放入其中。我们可以借用队列先进先出的特性,将各层节点入到队列中去,每出一个节点,将其左右节点带入。队列中存的是二叉树节点的地址,出队列不会销毁二叉树的节点。原创 2023-04-15 12:27:45 · 34 阅读 · 0 评论 -
【LeetCode】606.根据二叉树创建字符串
使用二叉树的中序遍历,需要注意的是当左节点为空,右节点不为空的时候要加上()。原创 2023-04-15 11:28:59 · 36 阅读 · 0 评论 -
【LeetCode】20.有效的括号
括号匹配问题,利用栈的特性,遇到左括号如‘(’,‘[’‘{’,将对应的右括号入栈,要出栈的数据一定与栈顶数据匹配(如对于上面一定是‘}’,‘]’,‘)’),不匹配就不是有效的括号。原创 2023-04-09 10:03:26 · 33 阅读 · 0 评论 -
【LeetCode】225.用队列实现栈 (C++,附优化版本代码)
我们仍然拿1,2,3,4,5举例,先将他它们入到pushq中去,这时候由于是模拟栈,我们想出的数据顺序是5,4,3,2,1,所以我们每次出数据是,只在pushq中留下最后一个元素,其余元素转移到popq中去。如果理解了用两个队列实现,那么不难发现,其实备用栈是可以省略掉的,我们直接将队列中最后一个元素前面的元素入到队列后面就可以了。用两个队列实现栈,其中一个队列用来存放数据,另一个队列是备用的。然后我们再交换一下pushq与popq。原创 2023-04-07 20:02:23 · 57 阅读 · 0 评论 -
【LeetCode】232. 用栈实现队列
popST负责出数据,这样我们入数据顺序是1,2, 3, 4, 5,出数据顺序也是1,2,3,4,5,看起来如同队列一般。示例:1, 2, 3, 4, 5,我们将其入到pushST中。用两个栈实现一个队列,入栈负责入数据,出栈负责出数据。出数据时,我们将pushST中的数据入到popST中去。原创 2023-04-07 19:25:50 · 35 阅读 · 0 评论 -
【LeetCode】142. 环形链表 II
意思就是x的距离等于从相遇位置再走z+(n-1)圈,从相遇位置开始走,走过的路程为z+(n-1)圈后与从初识位置开始走的指针相遇,相遇位置再环形入口。所以我们记录index1为初识位置,index2为相遇位置,两个指针一起走,当两者相遇时的位置就是环形入口。fast走过的路程:x+y+n(y+z),即fast不仅走了个x+y还多走了n圈(n至少为1)可以思考一下当fast每次走n步(n>2),slow每次走1步,两者是否还能相遇,为什么?n=2时,x=z+1(y+z);n=3时,x=z+2(y+z)原创 2023-04-01 16:14:29 · 57 阅读 · 0 评论 -
【LeetCode】面试题 02.07. 链表相交
如果两个链表不等长,我们先遍历两个链表,计算出它们的长度以及较长链表比较短链表多出来的长度gap,然后让较长链表的指针先走多出来的长度步,接着两个链表的指针同时向后遍历,直到找到它们的第一个公共节点。简化下问题,如果两个链表等长,那么我们只需要同时遍历两个链表,比较每个节点的地址是否相同就可以。如果没有公共节点,则返回 null。当然两者的思路可以合并。原创 2023-04-01 14:56:37 · 76 阅读 · 0 评论 -
【LeetCode】19. 删除链表的倒数第 N 个结点
起初,慢指针slow和快指针fast都指向虚拟头结点dummy,然后,我们让快指针先走n个节点。接着让快指针和慢指针一起走,直到快指针指向尾节点,这时候慢指针的下一个位置就是要被删除的节点。由于单链表不能倒着遍历,这里我们借助快慢指针来找到链表的倒数第n个节点位置。由于可能涉及头结点的删除,这里我们还是使用上虚拟头结点。原创 2023-03-31 16:13:22 · 37 阅读 · 0 评论 -
【LeetCode】24.两两交换链表中的节点
然后,我们用 cur 指针遍历链表,每次将 cur 指针后移两个位置(按交换前算),进行相邻节点的交换操作,交换时,prev->next = next,cur->next = next->next,next->next = cur。初始时,prev代表代表虚拟头结点,cur表示头结点,next表示头结点的下一个节点。题目要求两两节点进行交换,所以如果是1个节点就不交换,如果是3个节点就交换前两个,总之构不成一对的节点的就不交换。原创 2023-03-31 15:28:24 · 32 阅读 · 0 评论 -
【LeetCode】206.翻转链表
用cur来遍历原链表,再不断更新newhead,newhead从nullptr到1。reverse中cur用来遍历链表,cur为空返回newhead。用tmp记录下cur->next,那么cur就成了newhead。最容易想到的是遍历链表,依次将其反向,即迭代法。递归法跟迭代法的逻辑是一样的,如下面解释。原创 2023-03-31 14:14:11 · 28 阅读 · 0 评论 -
【LeetCode】707.设计链表
首先,我们需要定义一个结构体 LinkedNode,表示链表的节点。该结构体包含两个成员变量:val 表示节点的值,next 表示指向下一个节点的指针。然后,我们在类中定义一个私有变量 _dummyHead,表示链表的虚拟头结点,并初始化为 nullptr。同时,我们还定义一个私有变量 _size,表示链表中节点的数量,并初始化为 0。在各个操作函数中,我们需要事先做一些判断,本题中各个函数也给出了相应的提示;addAtIndex():在链表第index个节点前面插入一个节点。本题考察了链表的常用操作。原创 2023-03-31 12:54:29 · 87 阅读 · 0 评论 -
【LeetCode】203.移除链表元素
即在原本头结点前加一个哨兵位,这样我们就不需要再单独考虑原头结点的情况了,推荐用此方法。直接在原链表上修改,这时候我们需要考虑头结点是否与val相等。遍历链表节点,找出val并删除。原创 2023-03-31 11:18:33 · 37 阅读 · 0 评论 -
【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
定义begin与end,将mid的值赋给它们,然后通过while循环来确定起始边界,需要注意的是,当while循环结束时,begin = 3, end = 7,begin和end中间的区间才是起始边界,故需要return {begin + 1,end - 1}。调用getPosition时,mid = 5,然后我们开始寻找target在数组中的起始位置与结束位置。首先用二分法找到target,再探讨边界问题,具体二分法的使用在。对getPosition的解释。原创 2023-03-29 22:55:54 · 32 阅读 · 0 评论 -
【LeetCode】35.搜索插入位置
本题相对二分查找需要额外注意的就是,当要查找元素不在数组中,需要返回要插入的位置时就需要比较一下nums[mid]与target的大小了。若target = 16,那么 target就需要插入在mid + 1的位置了。,此时target < nums[6],故target应插入在下标为mid的位置。本题用到了二分法,二分法的具体讲解在。由于target = 10不在数组中,中已经展示过了,可以先做完二分查找再来做本题。循环结束后mid = 6。原创 2023-03-29 22:14:41 · 38 阅读 · 0 评论 -
【LeetCode】209.长度最小的子数组
起始位置left=0,循环过程中当right=3时,sum=8>target,记录下此时子数组的长度,这时候我们就开始要“微操”了,我们尝试让sum减去nums[0]看sum是否仍然比target大,若大于或等于target正好更新子数组的长度,若比target小则开始扩展右窗口(即继续for循环)。暴力求解中,我们使用了循环累加的方法,而滑动窗口的主要思想就是通过不断调节左右数组的边界,来找到其合适的位置,通过循环来控制窗口的右边界,再通过一个while来调整窗口的左边界。原创 2023-03-28 16:13:55 · 76 阅读 · 0 评论 -
【LeetCode】704.二分查找
为什么是lefttarget,下一次的查找区间为1[left,mid-1],即[0, 2]。,这样就满足了使用二分法的条件,我们只需要处理好边界就好。原创 2023-03-28 15:02:58 · 91 阅读 · 0 评论 -
【LeetCode】59.螺旋矩阵||
以循环1为例,第一次循环j从0到4,第二次循环j从1到3,第三次循环从2到2,这样们只需要每次循环结束后将起始行stx和起始列sty分别+1,让offset每次循环结束后+1控制循环的截止位置。n为偶数时,以6*6的矩阵为例,每种颜色的线条都代表一次循环,对于拐角处的数值我们采用了左闭右开方式的处理(即拐角处的数值交由下一个边来遍历)。这是有伙伴可能会有疑问,若是n为奇数呢,如果n为奇数的话,我们仍然只需要循环n/2次,这时候剩下的最中间的那个格子我们只需要补上其值就好了。从图中我们不难看出,我们需要。原创 2023-03-28 00:12:34 · 140 阅读 · 0 评论 -
【LeetCode】977.有序数组的平方
创建一个和nums等大小的数组,由于对nums来说,数组平方的最大值只可能在数组的两个边界产生,我们用left和right来记录nums的左右边界,用end来记录retnums的尾,从后往前填充retnums。创建一个新数组,将每个数的平方赋给新数组,最后简单来个快排。此方法的时间复杂度为O(n+log2n),未达到进阶要求。暴力求解法没有利用好本题数组。的特性,这里用双指针法进行优化。遇题不决,暴力求解,即方法一。原创 2023-03-26 23:39:16 · 70 阅读 · 1 评论 -
【LeetCode】27.移除元素
我们可以清楚的看到输入有两个连续的2,这就是没有--i导致的,由于后面的数据都向前移了一位,所以这时候我们需要再重新判断一下nums[i],所以--i这一步必不可少。本题最容易想到的方法就是通过遍历数组来找到val,然后删除(这里的删除指的是用后面的元素来覆盖)元素,如下方法一。当然,题目要求空间复杂度为O(1),所以我们不这样做,而是直接把原数组当做新数组,在原数组上做改动就可以了。首先我们需要搞清楚fast和slow是什么,fast是快指针,代码很容易写,值得稍加思考的是为什么需要再--i。原创 2023-03-26 23:17:21 · 26 阅读 · 0 评论