LeetCode题解
文章平均质量分 68
分享LeetCode题解
crayongrq
pain is inevitable suffering is optional
展开
-
LeetCode 94. 二叉树的中序遍历
先访问左子树的左子树,再访问左子树的根结点,最后再访问左子树的右子树。如何访问左子树的左子树呢?很简单,先访问左子树的左子树的左子树,再访问左子树的左子树的根结点,最后再访问左子树的左子树的右子树。grq:对于迭代代码,可以考虑一个局部情况,当root指向了最左下角的结点时,将其入栈,之后指向其左儿子(null),此时为空,那么将刚刚的左下角结点出栈,添加答案,之后指向右儿子(null),依然为空。grq:我们需要牢记的是每个被加入到栈中的都是根结点,最下层的叶子结点也是根结点(没有孩子结点的根结点)。原创 2024-09-14 10:54:33 · 452 阅读 · 1 评论 -
LeetCode 16. 最接近的三数之和
这道题和上一道思想类似,都是固定一个最左侧指针,然后使用双指针进行一个遍历。不同的是本题不需要去重,即找到一个最接近的解即可。初始化起始解的思想比较好,可以借鉴。原创 2024-09-14 10:53:09 · 592 阅读 · 0 评论 -
LeetCode 15. 三数之和
遍历到两个重复的值时,在第一次出现时已经将所有的情况枚举过了,第二次出现时就要将之前的情况pass掉。这道题使用伪三指针,实际上就是双指针想法,有一个指针动的比较少一些。因为要找的是值,而不是下标,所以要进行去重。另外,答案中要求不能用重复的元素,比如当。还有点疑惑,假设之前存在了一组解,下标为。,其中j接近k但远离i,那么当。时依然能够保证这组解被找到。原创 2024-09-13 09:58:56 · 561 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器
假设最优解的两个值为图中的两条竖线,我们的指针从左右两侧向中间移动,假设现在左边的指针先移动到了最优解的前面的竖线,现在要证明:如果左边指针先到达最优解的边界了的话,右边每次指向竖线的高度都严格小于左边指向的竖线。由此得到的结论是,假设左边先找到了最优解,那么右边的高度必然是严格小于左边界的。木桶原则是说一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板。整个题目可以理解为:最好要早相遇,否则在晚相遇的基础上,每次都要找最好的。本题使用双指针的做法, 指针移动过程中会天然地造成木桶的“底”不断变小。原创 2024-09-13 09:57:49 · 1252 阅读 · 0 评论 -
LeetCode 3. 无重复字符的最长子串
当右框框进来了重复值时,左框就要右移,保证框内无重复字符。当每个字符都能求解到以其为右框的不重复子串时,遍历整个字符串就能求到整个字符串的最长不重复子串。,我们的目标是找一个对于j最长的i,使得在该区间内不包含重复字符。之后用哈希表来存储区间中每个字符出现的次数,当一个新的j’出现的次数大于2时,那么重复的一定是。之间是不包含重复字符的,这样就会有矛盾,由不包含重复字符的空间。这个字符了,就要从i开始在哈希表中递减,直到减到之前出现的。,此时i’是重复的,因此是矛盾的。往后移动了,那么对应的。原创 2024-09-12 16:31:59 · 779 阅读 · 0 评论 -
LeetCode 1. 两数之和
双指针算法思想很简单,但是在实现上会有一些问题,当我们对原数组进行排序后(双指针要求有序),找到答案后返回的是下标也是随着并不是原序列的下标。这就需要将值和下标成对存储,并且按照值进行排序。,那么当前遍历到的数即为b,通过查看从头到当前b的这段范围内是否有a,来看能不能找到两个数的和。有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。这道题主要有三种方法:暴力循环、字典映射、双指针。枚举整型数组中的每一个数,第二层循环。时输出下标即可,此时注意输出的是。有两个循环,因此时间复杂度是。原创 2024-09-12 16:30:48 · 617 阅读 · 0 评论 -
LeetCode 206. 反转链表
之后一步一步地将tail结点向前返回,但在返回的过程中不利用,只是传递最终答案。绿线的操作就是当head为正数第一个结点时的调用情况。grq:递归的做法记得要将当前调用的head的指向置null,否则会出现链表中出现环的情况。递归代码的一个首要任务是找到整个链表的尾结点(反转后的头结点)。迭代代码与之前的K个一组翻转链表相同。原创 2024-09-10 15:23:20 · 722 阅读 · 0 评论 -
LeetCode 25. K 个一组翻转链表
与两两交换是对应的题目。依然是从dummy结点开始,首先要判断之后是否还有K个结点。如果不足,结束翻转。这里要分为三个部分进行处理,包含:K个结点的翻转、左边指向改变、右边被指向改变。K个结点的翻转:相当于是改K-1根线,因此循环K-1次。最终改完a会踩在翻转前第K个结点的位置,b就是下一组了。左边指向改变:原来是指向下一个结点的指针,要改为指向下一个K部分(此时该结点为本部分的尾端)。右边被指向改变:原来是被上一个结点指向,要改为被上一个K部分指向(此时该结点为本部分的头部)。原创 2024-09-10 15:24:22 · 632 阅读 · 0 评论 -
LeetCode 61. 旋转链表
首先要获得整个链表也是后k个结点的尾结点。由于整个是n个结点,除掉后k个结点后还有n-k个结点,要修改指针首先要跳到倒数第k+1个结点(正数第n-k个结点),从第一个结点跳n-k-1次就可以到达。将每个结点向右移动k个位置,实际上就是将后k个结点连接到头部。这道题目是不需要dummy结点的。grq:关于链表结点的修改顺序:改前先用,用后就改。原创 2024-09-10 12:47:44 · 475 阅读 · 0 评论