
日常刷题
文章平均质量分 50
记录每日刷题感谢
奉常席梦雨
这个作者很懒,什么都没留下…
展开
-
二分查找(分为两种情况)
第二种:左闭右开,因为右边取不到,所以left<right,并且left=mid+1,因为左边已经搜索过来mid为可取的,而right=mid,因为right本身就是不可取的,如果right=mid-1会导致少查一个。第一种:左闭右闭,那么就要考虑循环条件了。右边取得到所以left<=right,且mid赋值时因为是可取的,left要加一,right要减一。大体步骤:定义左右中三个下表,进入循环开始比较得出结果。原创 2024-04-03 20:01:35 · 352 阅读 · 0 评论 -
双指针(有序数组的平方,力扣977)
方法:创建一个新的数组来存放排序好的元素,定义三个指针分别指向原来数组的头尾和新数组的尾部(力扣977给的原数组是递减数组,要求输出的也是非递减数组),通过头尾指针对比大小放入新数组中,并用K来控制放入新数组的位置。原创 2024-04-04 16:05:05 · 497 阅读 · 1 评论 -
快慢指针(删除元素)
快慢指针实质上是通过一块一慢的指针来创建新的数组,通过快指针来来判断当前元素是否为新数组需要的,如果是就把快指针指向的赋给慢指针构建新的数组,如果不是新数组需要的则跳过该数更新后继续判断。原创 2024-04-03 21:06:00 · 283 阅读 · 0 评论 -
两个链表的交集(力扣349)
用·unordered_set来对需要查找的数列进行去重操作,创建答案也用unordered_set存放。输出结果中的每个元素一定是。[4,9] 也是可通过的。原创 2024-04-09 15:24:34 · 463 阅读 · 0 评论 -
力扣第15题三数之和
首先这题也可以用set来做但是去重麻烦,很难快速搞定,(用sort排序一遍先)所以我采用双指针来解决这道题,定义i,left,right,分别指向遍历头,和头的下一位以及最后一位。然后通过left和right的移动来判断这段里是否nums[i]+nums[left]+nums[right]==0,如果有就记录下来,然后再移动开始的节点i,需要注意的是去重操作,要对left和right对应的前后元素去重;原创 2024-04-10 18:06:59 · 1293 阅读 · 1 评论 -
环形链表||(力扣142)
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。解题难点:如何找到判断环和找到进入环的入口。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。解题思路:还是使用双指针的方法。返回索引为 1 的链表节点。返回索引为 0 的链表节点。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。原创 2024-04-06 21:42:51 · 450 阅读 · 1 评论 -
两数之和(力扣第一题)
解题思路:可以使用两个for循环来直接暴力破解,也可以使用map记录前面遍历过的数及其位置,然后判断当前遍历的数与之前遍历数的和是否等于目标数。需要注意的点是明白map的语法,比如创建和插入等;你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。整数,并返回它们的数组下标。你可以想出一个时间复杂度小于。你可以按任意顺序返回答案。,请你在该数组中找出。原创 2024-04-09 16:03:29 · 345 阅读 · 0 评论 -
删除链表的倒数第n个节点(力扣19)
给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。原创 2024-04-06 12:35:59 · 202 阅读 · 1 评论 -
设计链表(力扣707)
解题思路:可以使用直接法和虚拟节点法,这里我采用虚拟节点法方便进行操作,需要注意的尽量不要在插入函数里调用追加函数,防止记录长度的变量发生改变。// 链表变为 1->2->3。// 现在,链表变为 1->3。void addAtTail(int val) {//追加到最后一个。以指示链表中的上一个节点。假设链表中的所有节点下标从。你可以选择使用单链表或者双链表,设计并实现自己的链表。MyLinkedList() {//初始化。//插入第index个节点前。是指向下一个节点的指针/引用。原创 2024-04-05 21:00:00 · 1873 阅读 · 1 评论 -
反转字符串(力扣541)
解题思路:可以直接写一个reverse函数,也可以用系统的reverse,同时要注意反转的规则,因为每次到达2k时翻转,所以我们直接自增量设为2k,同时注意库函数通常都是。原创 2024-04-11 15:34:26 · 440 阅读 · 0 评论 -
KMP算法
小小的了解了一下,还是不是很懂,二刷的时候再来搞定它。原创 2024-04-12 15:07:30 · 348 阅读 · 0 评论 -
力扣383(赎金信)
这题和之前异位的那道题很像。这里一共有两种解法,第一种还是我们的老朋友暴力解法,第二种就是用数组这个哈希表记录magin中出现的字母的次数,然后再比较所需要字母的次数;原创 2024-04-09 20:46:53 · 346 阅读 · 0 评论 -
哈希表(力扣242,有效的字母异位词)
运用哈希表的方法,因为因为字母只要26个,所以创立一个有26个字母的数组,遍历第一个串,有的话就加一,再遍历后一个串,有的话就减一,最后看加一减一是否抵消,最后值为0。中每个字符出现的次数都相同,则称。,编写一个函数来判断。原创 2024-04-08 18:17:40 · 182 阅读 · 1 评论 -
交换量表节点(物理上,力扣24)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。原创 2024-04-06 11:58:25 · 422 阅读 · 1 评论 -
四数相加||(力扣454)
第二种是使用哈希表中的unordered map,因为其底层是哈希,运算的效率最快,然后对前两个数组进行遍历,并把结果放到map中,再对cd也进行循环得到c+d的值,然后find 0-cd,最后加起来图中有多少次。首先第一种方法是直接暴力解法,使用4个for循环遍历。,请你计算有多少个元组。原创 2024-04-09 20:17:53 · 335 阅读 · 0 评论 -
翻转链表(力扣206)
可以分别用双指针和递归方法计算,两种方法内在逻辑是一样的,不过需要理解的是所谓翻转就是把原来的头节点的next指向NULL,然后让原来的next指向head,以此类推。// 可以和双指针法的代码进⾏对⽐,如下递归的写法,其实就是做了这两步。,请你反转链表,并返回反转后的链表。// 和双指针法初始化是⼀样的逻辑。原创 2024-04-06 12:29:07 · 360 阅读 · 1 评论 -
链表相交(面试题,02.07)
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。在 B 中,相交节点前有 1 个节点。原创 2024-04-06 15:04:45 · 742 阅读 · 1 评论 -
滑动窗口(长度最小的子数列209力扣)
滑动窗口是通过两个移动不同的指针来实现,两个指针都指向数组第一个元素,然后其中一个指针遍历数组元素并且通过变量num来记录下和,当和大于等于目标时,通过两指针之间的差值得知子列长度,然后移动一位没动过的指针,不断循环该过程,要注意的点是注意判读有无符合条件的子列和。原创 2024-04-04 17:24:16 · 88 阅读 · 0 评论 -
力扣18题(四数之和)
解题思路:和三数之和是一样的运用双指针来移动,只不过多了一层for循环在三数之和的外面,同时要进行的减枝操作也有挺多而且很细节。原创 2024-04-10 19:30:45 · 412 阅读 · 1 评论 -
反转字符串中的单词(力扣151)
特别需要注意的是判断条件是fast<=s.size();去空格做法:运用快慢指针,判断快指针指向的是否为空,然后赋给慢指针的指向位置,但是因为单词与单词之间是有一个空格的,所以用慢指针来给赋值空格,并且因为首单词前面是没有空格的,所以对首单词要特殊判断。难点:该字符串中单词与单词之间有空格并且单词之前和之后也有空格,如果直接进行翻转操作会导致空格也被反转过去,所以要进行去空格。=' ')//但快指针不为空时。原创 2024-04-11 21:25:00 · 629 阅读 · 0 评论 -
螺旋矩阵II(力扣59)
通过reduce确认边界,并且判读要求输出的是否为奇数次,如果是就要额外输入,所以加上一个特殊的中间输入,同时要有两个变量确认每次开始时的位置。解题思路:明白怎么循环输出,并且每次循环的边界在哪里,确定好不变量。所有元素,且元素按顺时针顺序螺旋排列的。原创 2024-04-04 22:42:18 · 896 阅读 · 1 评论 -
移除链表元素(虚拟节点法、力扣203)
如果不使用虚拟头节点时,那么删除头节点和删除后面的节点要分开判断并且操作.较为麻烦,所以我们之接new一个节点,并且让它指向头节点,当我们进行后续的删除操作就都是一样的了,需要注意的是,循环判断删除建议使用while,如果使用for这个循环条件有些难以把握。同时遍历判断的时候要建立一个零时指针来存放头结点的位置用它来遍历,防止虚拟头结点指向错误,最后返回时要记得释放内存,并且把虚拟头结点的下一个节点设置为头节点。,请你删除链表中所有满足。给你一个链表的头节点。原创 2024-04-05 10:54:57 · 564 阅读 · 1 评论 -
力扣344反转字符串
解题思路:用双指针和一个临时变量temp。原创 2024-04-11 12:31:01 · 385 阅读 · 1 评论 -
二叉树层序遍历
解题思路:因为二叉树本身不肯用来遍历,所以我们采取用队列来模拟二叉树的方法遍历二叉树,原理是把二叉树的节点放入队列中,并且设置size来控制每次的弹出,以此来分辨每次的输出到底是第几层的东西。具体代码如下:(图片来源,代码随想录)原创 2024-04-17 20:35:28 · 271 阅读 · 0 评论 -
用队列来模拟栈
解题思路:首先搞清楚栈和队列的区别,然后一个队列便可以模拟栈,因为先进先出的关系,所以只用把前面的重新加载一次那么输出的顺序就和栈一样了。原创 2024-04-14 13:27:09 · 427 阅读 · 0 评论 -
优先级队列(力扣347,前k个高频元素)
大体思路:用map记录下来然后再快排,当然这样时间复杂度过高,我们也可以采用优先队列的方法。还没整懂pair那些基本的东西,这个补完知识点再弄。原创 2024-04-15 16:45:46 · 417 阅读 · 0 评论 -
从中序后序构造二叉树(力扣106)
这题我也不太会敲,暂时只懂个思路。原创 2024-04-21 11:34:38 · 122 阅读 · 0 评论 -
平衡二叉树(后序遍历,力扣110)
解题思路:采取后序遍历的好处是先遍历节点得到高度,然后再判断高度差是否大于一,如果是的话就返回-1,不是就返回两高度中较大的高度加一就是父节点的高度。给定一个二叉树,判断它是否是。原创 2024-04-20 09:38:58 · 675 阅读 · 2 评论 -
有效括号,力扣20题
解题思路如下:利用栈,找到向左开的括号,然后把对应的右括号放入栈中,然后对遍历的号进行匹配,如果和栈顶的括号相同,则通过,不相同的话就直接退出,并且考虑到是一左一右,所以字符串的长度要是个偶数,不是的话就直接跳过,同时不符合条件一共有三种可能 1. 左括号多了,2 右括号多了,3 括号不匹配,if(s.size()%2!//判断长度是否为奇数,是的话就肯定错。,判断字符串是否有效。原创 2024-04-14 14:41:38 · 466 阅读 · 0 评论 -
最大二叉树(力扣654)
[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 []。- 只有一个元素,所以子节点是一个值为 1 的节点。- 只有一个元素,所以子节点是一个值为 0 的节点。- 空数组,无子节点。- 空数组,无子节点。原创 2024-04-22 20:58:17 · 1409 阅读 · 0 评论 -
反转二叉树(力扣226)
解题思路:用队列进行前序遍历的同时把节点的左节点和右节点交换。原创 2024-04-17 20:39:13 · 594 阅读 · 0 评论 -
二叉树递归遍历
原创 2024-04-16 19:27:54 · 143 阅读 · 0 评论 -
滑动窗口最大值(力扣239)
解题思路:首先是用暴力循环来解,其次便是用队列来模拟这个滑动窗口,同时要自定义三个函数,一个pop用来弹出来保证滑动窗口的移动,同时我们把最大的放在队列口那里,当每次有更大的就把原来的挤出栈外,一个push用来把前面不够大的元素排挤出队列并且把最大的那个数压入队列,还有一个find来找到最大的元素。原创 2024-04-15 11:19:43 · 845 阅读 · 0 评论 -
513.找树左下角的值
解题思路:用层序遍历。从右遍历到左最好一个肯定是。假设二叉树中至少有一个节点。原创 2024-04-21 11:29:32 · 268 阅读 · 0 评论 -
二叉树的最小深度(力扣111)
解题思路如下:该题和最大深度类似,但有坑,就比如当左子树或右子树一方为空而其他一方不为空时,如果不特殊判断的话就会倒置返回0;最大深度求法可以看我主页中之前发的。具体代码实现:(图片来源代码随想录)原创 2024-04-18 17:53:39 · 278 阅读 · 2 评论 -
找到二叉树最大深度(力扣104)
解题思路:分别是用前序遍历和后序遍历,前序遍历就是正常的从上到下求深度,而后续遍历就是从下到上求高度,而高度和深度是互逆的,所以这里采用后续遍历,需要注意的是,最底层是从1开始的,所以遍历到底部时记录的高度时1+遍历。是指从根节点到最远叶子节点的最长路径上的节点数。原创 2024-04-18 17:49:36 · 449 阅读 · 0 评论 -
判断二叉树是否对称
解题思路:首先判断特殊情况,比如左右子树是否为一空一有,是否为两空,是否相等,然后递归判断外侧是否相等(即为左子树的左节点和右子树的右节点)和内侧是否相等(即为右子树的左节点和左子树的右节点)给你一个二叉树的根节点。, 检查它是否轴对称。原创 2024-04-17 20:44:10 · 267 阅读 · 0 评论 -
左叶子之和(力扣404)
解题思路:用后序遍历找左孩子,需要注意的是左叶子需要通过其父节点来判断其是不是左叶子。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有左叶子之和。原创 2024-04-21 11:27:43 · 369 阅读 · 0 评论 -
二叉树的所有路径(力扣257)
解题思路:因为求的是路径,从根节点开始,所以采用中序遍历。并且要记录下路径,我们还要额外采用一个临时存放一条路径的容器,当遍历完一条时放入result中,再遍历另一条,这里采用的就是回溯了。// 中,中为什么写在这里,因为最后一个节点也要加入到path中。if (cur->right) { // 右。if (cur->left) { // 左。// 这才到了叶子节点。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。原创 2024-04-21 11:22:04 · 537 阅读 · 0 评论 -
用栈来模拟队列
思路:首先栈是先进后出,队列是先进先出,所以用两个栈来模拟队列,一个用来进,一个用来出,用来进的再弹给用来出的便是队列的顺序了,具体代码如下。原创 2024-04-14 13:23:41 · 479 阅读 · 0 评论