刷题日记
文章平均质量分 71
刷题日记
小米睡不醒.
热爱学习编程,以及编程知识的分享!
展开
-
牛客热题:包含min函数的栈
时间复杂度:O(1), 所有的请求均以O(1)的方式实现。 判断当前的值和s2的栈顶的数据比较,维护一个单调栈,用于实现常数级的min查询。空间复杂度:O(N), 使用了两个栈空间。 如果该值小就将其同时入栈给两个栈。,而第二个栈将自己的栈顶数据重入一遍。 否则,只入栈给第一个栈。 两个栈同时出栈即可。思路来自牛客大佬题解。原创 2024-05-20 13:53:18 · 639 阅读 · 0 评论 -
牛客热题:用两个栈实现队列
时间复杂度:O(N) , 每次push的时间复杂度是O(1), 但是pop的时候,因为存在需要将其中的栈的数据搬运到另一个栈所以需要O(N)的复杂度,其中N是对应的搬运的数据的个数。空间复杂度:O(1), 除了题目给出的栈以外,只使用了常数个额外的变量空间。原创 2024-05-20 13:16:49 · 259 阅读 · 0 评论 -
牛客热题:二叉搜索树的最近公共祖先
空间复杂度:主要取决于递归调用的深度,即函数调用栈的使用情况。在最坏情况下,如果二叉搜索树是一个不平衡的树,递归调用可能达到树的高度。因此,空间复杂度为 O(h),其中 h 是树的高度。时间复杂度:这段代码的时间复杂度取决于树的高度,即 O(h),其中 h 是树的高度。原创 2024-05-19 13:51:03 · 298 阅读 · 0 评论 -
牛客热题:在二叉树中找到两个最近公共祖先
这段代码主要是用来判断一棵二叉树是否是平衡二叉树的。空间复杂度: O(n),因为需要递归调用的栈空间。时间复杂度:O(n)原创 2024-05-19 13:50:14 · 327 阅读 · 0 评论 -
牛客热题:判断是否是平衡二叉树
这段代码主要是用来判断一棵二叉树是否是平衡二叉树的。空间复杂度: O(n),因为需要递归调用的栈空间。时间复杂度:O(n)原创 2024-05-18 12:16:49 · 614 阅读 · 0 评论 -
牛客热题:判断二叉树是不是搜索二叉树
空间复杂度:O(M),申请了一个队列空间,该队列的最大空间为二叉树的最后一层的节点数。时间复杂度:O(N), 遍历了一遍二叉树。原创 2024-05-17 12:03:01 · 428 阅读 · 0 评论 -
牛客热题:判断是否是完全二叉树
空间复杂度:O(M),申请了一个队列空间,该队列的最大空间为二叉树的最后一层的节点数。时间复杂度:O(N), 遍历了一遍二叉树。原创 2024-05-17 12:01:53 · 368 阅读 · 1 评论 -
牛客热题:镜像二叉树
空间复杂度:O(N),没有额外开变量,但是递归调用的函数栈帧的个数和二叉树的节点数相同。时间复杂度:O(N) , 遍历一遍二叉树。原创 2024-05-16 13:22:50 · 392 阅读 · 0 评论 -
牛客热题:合并二叉树
空间复杂度:O(N)。没有申请新的空间,但是递归调用栈占用了N的空间。时间复杂度:O(N),等于中序遍历的时间复杂度。原创 2024-05-16 13:06:06 · 285 阅读 · 0 评论 -
牛客热题:二叉树与双向链表
空间复杂度:O(N)。没有申请新的空间,但是递归调用栈占用了N的空间。时间复杂度:O(N),等于中序遍历的时间复杂度。原创 2024-05-15 12:15:32 · 694 阅读 · 0 评论 -
牛客热题:二叉树的最大深度
这样通过递归的方式,从根节点开始逐层向下计算深度,直到叶子节点为止,最终得到整棵树的最大深度。对于空间复杂度,在最坏情况下,递归调用会将所有节点压入调用栈,导致空间复杂度为 O(N)。这段代码使用了广度优先搜索(BFS)的思路来计算二叉树的最大深度。综上所述,这段代码的时间复杂度为 O(N),空间复杂度为 O(W)。时间复杂度:O(N)空间复杂度:O(W)原创 2024-05-15 11:12:09 · 583 阅读 · 0 评论 -
牛客热题:二叉树的后序遍历
空间复杂度:O(N), 创建了一个和二叉树节点数相等的数组,用来返回对应的答案。空间复杂度:O(N), 使用了额外的栈空间。时间复杂度:O(N) ,遍历了一遍二叉树。时间复杂度:O(N),遍历了一遍二叉树。原创 2024-05-14 14:40:24 · 292 阅读 · 0 评论 -
牛客热题:二叉树的中序遍历
空间复杂度:O(N) , 使用了一个和二叉树节点数相同的数组。时间复杂度:O(N) ,遍历了一遍对应的二叉树。空间复杂度:O(N), 答案数组和对应栈空间。时间复杂度:O(N) ,遍历了一遍二叉树。原创 2024-05-14 14:00:29 · 471 阅读 · 0 评论 -
牛客热题:二叉树的前序遍历
空间复杂度:O(N),使用了和二叉树的节点数相同的答案数组和对应的栈空间。空间复杂度:O(N) , 使用了一个和二叉树节点数相同的数组。时间复杂度:O(N) ,遍历了一遍二叉树。时间复杂度:O(N),遍历了一遍二叉树。原创 2024-05-14 13:36:50 · 319 阅读 · 0 评论 -
牛客热题:旋转数组的最小数字
,大部分情况维持二分的时间复杂度,但是当全相等的时候,就变成了O(N)空间复杂度:O(1),使用了常数个额外的变量。原创 2024-05-13 16:59:11 · 382 阅读 · 0 评论 -
牛客热题:比较版本号
时间复杂度:O(N) ,只遍历了一次对应字符串。空间复杂度:O(1),使用了常数个变量。原创 2024-05-13 16:52:55 · 386 阅读 · 0 评论 -
牛客热题:逆序对数量
归并排序内部又是将原数组分成很多个小区间,然后相邻的小区间再进行合并。逆序对:数组左边边的元素大于右边的元素则被称为一个逆序对。首先归并排序的思路就是将两个原本有序的数组合并为一个数组。空间复杂度:O(N), 借用了和原数组长度相同的辅助数组。那么在合并的途中,就涉及到那些元素的位置需要交换。(其中i,j是两个待合并数组的下标)),采用了归并排序的思路。原创 2024-05-10 09:30:17 · 225 阅读 · 0 评论 -
牛客热题:寻找峰值
2.反之是下降的趋势,那么说明答案一定在左侧,所以我们舍弃右半部分区间。②计算mid,并且查看mid的值和他右边的值->用来判断mid的趋势。:增长的趋势,那么说明答案一定在右侧,所以我们舍弃左半部分区间。空间复杂度:O(1), 使用了常数个变量。空间复杂度:O(1), 使用了常数个变量。时间复杂度:O(N), 遍历了一遍数组。①首先将l,r位于数组的首尾。原创 2024-05-10 09:29:37 · 660 阅读 · 0 评论 -
牛客热题:二分查找
首先l, r分别指向数组的两端。空间复杂度:O(1), 使用了常数个额外的变量。计算l,r的中点mid,查看。),每次将搜索范围除以2。和target的关系。原创 2024-05-10 09:28:47 · 255 阅读 · 0 评论 -
牛客热题:删除链表中的重复元素-II
相等:则ne向后遍历,寻找不等于cur的节点,或者直到链表尾部。时间复杂度:O(N), 遍历了一遍链表,和一遍数组。分别表示前一个节点,当前节点,和下一个不重复的节点。空间复杂度:O(1), 使用了常数个变量。不相等:这三个指针都向后移动一个节点。时间复杂度:O(N), 遍历了一次链表。空间复杂度:O(N), 使用了哈希表。维护三个指针pre,cur,ne。原创 2024-05-09 09:08:05 · 602 阅读 · 0 评论 -
牛客热题:删除链表中的重复元素-I
空间复杂度:O(1), 使用了常熟个变量。时间复杂度:O(N),遍历了一遍链表。原创 2024-05-09 09:06:16 · 415 阅读 · 0 评论 -
牛客热题:链表的奇偶重排
空间复杂度:O(N), 借用了两个额外的数组空间,总长度为链表的长度。时间复杂度:O(N), 遍历两次链表,一次取数字,一次放数字。空间复杂度:O(1), 使用了常数个额外的变量。时间复杂度:O(N),只遍历了一次链表。原创 2024-05-08 08:55:54 · 270 阅读 · 0 评论 -
牛客热题:单链表排序
空间复杂度:O(1),借用了常数个额外的空间。),用了c++原生的sort,底层是快排。O(N),借用了额外的数组空间。),利用归并排序的思路实现。原创 2024-05-06 22:03:29 · 899 阅读 · 1 评论 -
牛客热题:链表相加(二)
空间复杂度:O(M + N), 创建了一个max(m, n) + 1的链表。时间复杂度:O(N), 反转是O(N), 相当于遍历了两次链表。原创 2024-05-06 09:53:03 · 227 阅读 · 0 评论 -
牛客热题:两个链表的第一个公共节点
让N1和N2一起遍历,当N1先走完链表1的尽头(为null)的时候,则从链表2的头节点继续遍历,同样,如果N2先走完了链表2的尽头,则从链表1的头节点继续遍历,也就是说,N1和N2都会遍历链表1和链表2。使用两个指针N1,N2,一个从链表1的头节点开始遍历,我们记为N1,一个从链表2的头节点开始遍历,我们记为N2。因为两个指针,同样的速度,走完同样长度(链表1+链表2),不管两条链表有无相同节点,都能够到达同时到达终点。(N1最后肯定能到达链表2的终点,N2肯定能到达链表1的终点)。原创 2024-05-04 12:55:28 · 277 阅读 · 1 评论 -
牛客热题:链表中的倒数最后K个节点
链表中倒数最后k个结点_牛客题霸_牛客网 (nowcoder.com)原创 2024-05-03 18:25:19 · 409 阅读 · 0 评论 -
牛客热题:链表中环的入口结点
通过定义slow和fast指针,slow每走一步,fast走两步,若是有环,则一定会在环的某个结点处相遇(slow == fast),根据下图分析计算,可知从。原创 2024-05-02 15:47:56 · 288 阅读 · 0 评论 -
牛客热题:判断链表是否有环
O(N),其中N为链表的长度,原因是当第一次相遇的时候慢指针的移动距离不会超过链表的长度。:O(N),其中N为链表的长度,遍历最多为链表的长度就可以判定是否有环。:O(N),最多使用链表长度的空间。:O(1),只建立了两个指针。原创 2024-04-30 22:56:26 · 90 阅读 · 0 评论 -
牛客热题:合并K个升序链表
个数字中的最小值,我们可以借助堆,也就是优先队列—>priority_queue来完成这一点。如果非要按照归并排序的合并思路,双指针不够用,我们可以直接准备。每个链表最多被遍历k - 1次,我们放缩为k次,那么需要最多。由于所有的链表的长度加起来为。, 使用了常数个额外的空间。但其实一般达不到O(个指针,每次比较得出。原创 2024-04-30 22:20:05 · 467 阅读 · 0 评论 -
牛客热题:合并升序链表
截止条件:当pHead1或者pHead2中有一个是空指针的时候,我们就返回其中哪个不为空的指针;的功能是合并这两个链表并使新链表中的节点仍然是递增排序的。空间复杂度:O(1) ,只使用了常数量级的变量个数。时间复杂度:O(N + M) ,遍历一次两个链表。时间复杂度:O(N + M) ,遍历一次两个链表。空间复杂度:O(N + M) ,迭代次数占用空间。若两个都为空指针,那么就随便返回其中一个。这时候我们当前的节点一定是以。原创 2024-04-29 21:58:45 · 776 阅读 · 0 评论 -
牛客热题:反转单向链表
2.所以我们每一次只需要将当前节点的next指向pre即可,然后再将pre指向cur,cur指向n;如何想到递归:因为我们反转单向链表的一个难点就是,无法快速的获取当前节点的上一个节点。同时n指向自己的next,直到cur指向空指针则完成链表的反转。空间复杂度:O(1) ,只使用了常数量级的变量个数。空间复杂度:O(1) ,只使用了常数量级的变量个数。n: 表示的是当前节点的下一个节点。时间复杂度:O(N) ,遍历一次链表。2.一个节点的链表:直接返回头指针。cur:表示当前遍历的节点。原创 2024-04-28 21:28:30 · 258 阅读 · 1 评论 -
双指针,BFS和图论
思路:我们先将所有的数据读入然后按照时间顺序进行排列存储在一个pair数组内部,然后一次去遍历时间区间。所以我们的目标就变成将原来的k个环变成n个环,那么我们需要分别n - k即可;并且我们发现,当我们将同一个环内的点进行交换,那么我们就可以得到两个环。我们将不同环内的点进行交换,那么我们可以将两个环合并为一个环。原创 2024-03-27 21:59:27 · 533 阅读 · 0 评论 -
线段树和树状数组
记录了一些树状数组和线段树的笔记原创 2024-03-24 14:38:34 · 699 阅读 · 2 评论 -
枚举和模拟
一些枚举和模拟相关的例题原创 2024-03-19 17:38:08 · 314 阅读 · 2 评论 -
蓝桥杯必考算法递归以及相关题目
蓝桥杯递归算法和相关题目原创 2024-02-27 20:15:58 · 1021 阅读 · 11 评论 -
c++力扣题目全排列
典型的回溯题⽬,我们需要在每⼀个位置上考虑所有的可能情况并且不能出现重复。索的⽅式,不断地枚举每个数在当前位置的可能性,并回溯到上⼀个状态,直到枚举完所有可能性,每个数是否可以放⼊当前位置,只需要判断这个数在之前是否出现即可。在每个递归状态中,枚举所有下标i,若这个下标未被标记,则使⽤。数组的⻓度时,说明我们已经处理完了所有数字,将当前数组。标记元素,然后从第⼀个位置开始进⾏递归;⽤来存放所有可能的排列,⼀个⼀维数组。在每个递归的状态中,我们维护⼀个路径。,表⽰当前已经处理的路径;⽤来存放每个状态的排。原创 2023-11-02 19:30:40 · 134 阅读 · 0 评论 -
C++二叉树的所有路径
我们从这道题中了解到全局变量在回溯中的重要意义,和利用函数的递归特性帮我们实现path字符串的生成。原创 2023-11-01 16:33:59 · 140 阅读 · 0 评论 -
C++二叉搜索树中第K小的元素
1.定义⼀个全局的变量count,在主函数中初始化为k的值(不⽤全局也可以,当成参数传⼊递归过。个最小元素(从 1 开始计数)。我们采用中序遍历+计数器剪枝的思路。,请你设计一个算法查找其中第。给定一个二叉搜索树的根节点。直接返回,说明没有找到;原创 2023-11-01 15:36:12 · 102 阅读 · 0 评论 -
C++递归实现验证⼆叉搜索树
后序遍历按照左⼦树、根节点、右⼦树的顺序遍历⼆叉树的所有节点,通常⽤于⼆叉搜索树相关题⽬。中序遍历的过程中,先判断是否和前驱结点构成递增序列,然后修改前驱结点为当前结点,传⼊下⼀。如果⼀棵树是⼆叉搜索树,那么它的中序遍历的结果⼀定是⼀个严格递增的序列。给你⼀个⼆叉树的根节点root,判断其是否是⼀个有效的⼆叉搜索树。c.然后判断当前结点是否满⾜⼆叉搜索树的性质,⽤**b. 先递归判断左⼦树是否是⼆叉搜索树,⽤**d.最后递归判断右⼦树是否是⼆叉搜索树,⽤**初始化⼀个全局的变量**原创 2023-10-31 20:08:06 · 160 阅读 · 0 评论 -
C++二叉树剪枝
函数的返回值:根据题目的意思我们要将那些全零的子树全部在树中删除,那么我们最好是返回一个。首先我们应该想到我们去递归解答这道题目,函数的参数非常好确认就是。未使用额外的空间,空间复杂度为:O(1);请剪除该二叉树中所有节点的值为。我们要实现的肯定是一个深度优先遍历。,树的每个节点的值要么是。时间复杂度为O(N);原创 2023-10-30 22:28:26 · 693 阅读 · 0 评论