- 博客(68)
- 收藏
- 关注
原创 leetcode 热题 100_两两交换链表中的节点
递归:将链表节点传入递归函数,如果节点位于链表尾部且无需交换则直接返回,否则将该节点和其下一节点交换并调用递归函数。迭代:设置节点指针存储结果,遍历链表,直接修改节点的指向。
2024-03-15 00:14:53 375
原创 leetcode 热题 100_删除链表的倒数第 N 个结点
递归:利用递归栈逆向遍历链表,并用全局变量记录当前遍历的是倒数第几位节点,当遍历到待删节点的上一位节点时,需要注意当删除的是头节点时,直接。
2024-03-13 22:59:09 372
原创 leetcode 热题 100_两数相加
迭代:首先判断整数0,然后分别遍历两段链表,将对应位数的值相加并存入新链表,再遍历新链表,将节点值val>=10的减10,并且其下一节点值val+=1。需要注意最后一位节点进位是将下一位节点值设置为1。
2024-03-13 22:30:30 407
原创 leetcode 热题 100_合并两个有序链表
递归:将迭代的过程通过递归来实现,但由于递归核心代码是从链表末端开始执行的,所以无需考虑链表节点的覆盖问题,不容易出错,但递归也较难理解。迭代:分别用两个指针遍历两段链表,逐步比较两链表的节点,将值较大的节点存入新链表,同时指针移动,直到某段链表遍历结束,将另一段链表剩余的节点存入新链表。作为参数递归调用,并将较大的节点作为返回值。指向下一节点,这里下一节点可能是和它比较的节点。,具体要进行下一步比较,所以我们将节点。再比较传入的两节点值(记做节点。来存避免新链表指针出错。,或者它原先的下一节点。
2024-03-13 00:09:17 397
原创 leetcode 热题 100_环形链表 II
哈希表:遍历链表,用哈希表存储遍历过的链表节点,判断链表节点是否在哈希表中存在,如果存在说明链表出现过,第一个重复出现的节点即为开始入环的第一个节点。快慢指针:用一快一慢的双指针遍历链表,如果指针不相遇则说明不存在环形结构,如果相遇则存在环形结构。第一次相遇时,快指针走过的路程是慢指针的两倍。表示在环形走走了若干圈还是回到环形开始节点),所以此时慢指针再走。步就会到达环形开始节点。从链表开始的某个指针要到达环形开始节点处,需要走。,快指针相比慢指针多走了若干圈环形结构。步后到达环形开始节点,与慢指针相遇。
2024-03-12 22:59:47 358
原创 leetcode 热题 100_环形链表
快慢指针:用两个移动速度一快一满的指针遍历链表,如果链表中不存在环形结构,则快指针会保持领先,并且先到达末尾;而如果链表中存在环形结构,则快指针会先进入环形结构,并且在环形结构中某一节点和慢指针相遇。附上官方的演示动画(来源。哈希表:遍历链表,如果哈希表中出现过该节点说明存在环形结构,否则将节点写入哈希表。
2024-03-11 22:25:08 404
原创 leetcode 热题 100_螺旋矩阵
模拟:定义四个边界,指针按右下左上的顺序遍历,每遍历一条边,边界就减一,并且在某个方向没有可以遍历的数时直接返回。
2024-03-11 21:42:06 399
原创 leetcode 热题 100_回文链表
链表反转:将回文前半部分反转,此时前半部分与后半部分一致。利用这一特点我们可以反转链表的前半部分,再将前半部分与后半部分比较,一致则是回文。通过快慢指针可以定位到链表中部,快指针走两步,慢指针走一步,则快指针到达末尾时慢指针恰好到达中部。迭代+递归:通过迭代正向遍历链表,通过递归逆向遍历链表,同时进行比较。双指针数组:将链表存储在数组中,通过双指针双向访问数组进行比较。有两点需要注意:第一,当节点个数为奇数时,慢指针。恰好定位到中间节点,但中间节点不进行比较,所以。当节点个数为偶数是,慢指针。
2024-03-11 02:03:17 484
原创 leetcode 热题 100_反转链表
非空,再存储最后一个节点,也是就反转后的第一个节点,便于结果返回。迭代:逐步修改节点指针,注意在修改前要保存下一个节点指针。递归:利用递归栈存储先出现节点的信息。,返回先前存储的最后一个节点。,最后再将第一个节点指向。
2024-03-11 00:26:29 348
原创 leetcode 热题 100_相交链表
哈希表:两链表出现的第一个相同的值就是相交节点,因此我们先用哈希记录链表A所有出现过的值,再遍历链表B查找哈希表,找出第一个相同的值即为结果。理由是链表AB具有相同段和不同段,记不同段为Ta、Tb,记相同段为Tc,则按上述步骤遍历至交点时,指针ab的路径。这样,如果两链表有相交点的话,指针ab会同时到达这个交点。双指针遍历:以指针a,指针b分别遍历链表A和链表B。
2024-03-10 04:25:46 373
原创 leetcode 热题 100_搜索二维矩阵
二叉搜索树:从矩阵右上角观察,结构类似二叉搜索树,因此可以用类似的解法来做。具体做法是双指针从右上角开始,向左下角逐步搜索,如果当前值比目标值大,则向下移动,如果当前值比目标值小,则向左移动。直到找到目标值或指针出界。
2024-03-10 02:00:26 525
原创 leetcode 热题 100_矩阵置零
标记变量:常规的做法是利用一个二维数组存储置零后的结果,或者利用两个一维数组存储待置零的行列数。此题可以用常量空间解决,可以利用原数组的第一行存储待置零的行,第一列存储待置零的列,但第一行和第一列的原数据也会丢失,因此我们需要利用两个布尔值分别存储原第一行和原第一列是否需要置零。也就是说,我们将原数组划分为了第一行、第一列、剩余数组三部分进行处理。具体的做法是先用常量存储第一行第一列的待置零位置,再用第一行第一列存储剩余数组的待置零位置,最后根据上述信息置零。
2024-03-09 00:56:04 364
原创 leetcode 热题 100_缺失的第一个正数
正负模拟哈希:偏技巧类的题目,在无法使用额外空间的情况下,只能在原数组中做出类似哈希表的模拟。除去数值,我们还可以用正负来表示下标值的出现情况。首先,数组中存在正负数和0,而负数和0对结果是没有影响的,我们将它们设置为一个较大的正数。第二,我们需要用绝对值来表示这些正整数,因为先出现的值可能会将后出现的值设置为负数。的方式,出现偶数次的数值仍然会被判断为未出现过,因此必须加上判断语句。设想一下,没有出现的最小的正整数可能的值,一定是在。最后我们遍历数组,找到的第一个正数,,如此,当前数组中就只存在正整数。
2024-03-08 23:06:52 411
原创 leetcode 热题 100_除自身以外数组的乘积
O(1)空间复杂度解法:题目规定输出数组不视为额外空间,因此可以直接在输出数组进行前缀数组和后缀数组的计算,先从左到右计算前缀数组,再从右到左直接将后缀数组乘入前缀数组。需要注意边界值的处理。前缀 / 后缀数组:某元素除自身以外的乘积,也就是其。,因此我们可以构造前缀数组和后缀数组,分别存储前。得到结果并用新数组存储。
2024-03-08 22:18:29 414
原创 leetcode 热题 100_轮转数组
循环直到回到第一个开始移动的值。,这个过程可能有若干元素没有被移动,因此需要从。计数,每次移动都+1,直到等于数组长度。这个解法效率较低并且较难理解,不推荐。新数组存储:另外用一个数组存储移动后的结果,再复制回原数组。如何判断所有的值都被移动过一次呢,另外用一个。数组翻转:将整个数组进行反转,再以下标。左右两段分别进行翻转就得到最终结果,很巧妙的解法。原数组移动:在原数组上直接将。,被覆盖的值则继续向后移动覆盖。,需要临时存储被覆盖的值。
2024-03-08 21:15:18 446
原创 leetcode 热题 100_合并区间
区间左边界的大小判断是否重叠,如果重叠则将区间合并为一个。考虑到区间完全处于另一区间内的情况,合并时应该选择。排序:先将区间按左边界从小到大进行排序,假设排序后。区间右边界的较大值作为合并结果。
2024-03-06 23:07:31 399
原创 leetcode 热题 100_最大子数组和
动态规划只确保决策过程的最优化,而不保证结果的最优化,所以最后我们需要找出dp数组中的最大值作为结果。当数组长度每增加1时,最大和连续子数组有两种可能,一是原先的最大和连续子数组加上增加的元素。表示0~i组成的数组的最大子数组和。当数组长度为1时,最大和连续子数组是它本身,也就是。,二是舍弃掉原先的最大连续子数组,以这个增加的元素作为起始建立的新的连续子数组。动态规划:这是一道经典的动态规划题。,我们选择其中的较大值。
2024-03-06 21:41:38 421
原创 leetcode 热题 100_最小覆盖子串
双指针滑动窗口:暴力解法——用双指针来表示字符串s中的子串首尾,遍历所有子串并与字符串t判断是否符合条件。我们可以对遍历和判断的过程进行优化,首先是遍历,右指针先移动直到涵盖所以需要的字母,左指针再移动删除不需要的字母,也就是窗口扩展时寻找可行解,窗口收缩时优化可行解。循环这个过程,找出所有符合条件的子串,比较出最短的子串。然后是判断,维护一个数组,数组下标表示字母,数组内容表示当前滑动窗口下,我们还需要的字母数量。当数组均小于等于0时,代表已经涵盖了所有需要的字母。
2024-03-06 20:47:14 416
原创 leetcode 热题 100_滑动窗口最大值
对于添加的元素,直接和当前最大值比较即可,但对于移除的元素,如果移除的是原先的最大值,则需要重新遍历窗口寻找新的最大值,因此优化的重点在于避开遍历窗口这一步骤。通过构造一个递减的Deque双端队列,我们可以将当前最大值维护在队首,并且当最大值被移除时,新的最大值依然在队首。而添加的元素则可以从队尾插入,同时,可以将队尾小于添加元素的值全部移除,因为位于窗口末尾的元素一定比其他元素晚移除,比它小的值不可能成为窗口的最大值。以下附上动画演示(来源。
2024-03-06 19:07:39 425
原创 leetcode 热题 100_和为 K 的子数组
我们用HashMap哈希表来存储pre[ ]及该前缀和的值当前出现的次数,我们遍历到pre[y]时,判断pre[x-1]在前面出现过几次,也就是以y结尾的满足条件的子数组有几组。前缀和数组+哈希表:可以计算所有子数组之和暴力求解,但复杂度太高。对于子数组求和的过程,我们可以采用前缀和数组进行优化,前缀和数组中。题目要求和为k的子数组,也就是。之和,当我们要计算子数组。
2024-03-04 23:30:50 363
原创 leetcode 热题 100_找到字符串中所有字母异位词
滑动窗口:类似于字符串匹配,但匹配异位词需要包含相同的字母及个数,可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数,再用。
2024-03-04 22:13:28 393
原创 leetcode 热题 100_无重复字符的最长子串
滑动窗口+哈希表:假设字符串为"abcabcbb",遍历循环所有子串,以不同位置作为子串的起始,则会得到以下最长子串。其中最长子串的右端点会随着左端点的右移而右移,也可能不变,原因是最长子串后的第一位字符,一定在最长子串中出现过,例如"(abc)a"中‘a’出现在最长子串“abc”中。因而最长子串的某一位被移除(也就是若干次左端点右移)时,可能将重复的字符移除了,此时右端点就可以进行右移了。根据这点我们可以通过控制双指针的移动实现滑动窗口,优化暴力枚举,并利用HashSet哈希表去重。
2024-03-03 23:36:45 350
原创 leetcode 热题 100_接雨水
单调栈:由于只有凹型结构可以接住雨水,因此我们可以找出高度图中的所有凹型结构,计算接住雨水的量总和。遍历数组依次入栈,如果是递减结构则继续入栈,如果出现递增,则判断是否满足凹型结构(栈中至少有两个元素),如果不满足则说明只能形成两根递增结构的柱子,此时将左柱子出栈,如果满足则根据水桶效应计算三个柱子能接住的雨水量,并将中部柱子出栈。按列求:分别考虑每一列的雨水高度,某列的雨水高度只与其左侧最高墙和右侧最高墙有关,一种情况是该列比左右侧的墙都低,则根据木桶效应该列雨水高度为。,最后将每列的雨水高度相加即可。
2024-03-03 22:07:37 475
原创 leetcode 热题 100_三数之和
双指针遍历:暴力解法的三层遍历会超时,因此需要优化遍历的过程。首先是需要对结果进行去重,这里采用排序+跳过重复值的做法,在指针遍历时跳过已经遍历过的相同值。在第一层循环确定第一个值后,剩下两个符合要求的值一定是在其后相继出现的,因此可以用双指针从两侧逼近寻找符合的值,下面附上官方提供的伪代码(来源。
2024-03-03 00:42:20 462
原创 leetcode 热题 100_盛最多水的容器
我们可以令底部距离逐步递减(左右两边的指针向中部移动)。此时对于min(左高度,右高度),假设较高的线向中部移动,则min(左高度,右高度)一定不变或减小,反之较矮的线向中部移动,min(左高度,右高度)有可能增加,遍历过程如下图(来源。值得注意的是,当两侧的线高度相同时,假设围成的容器内部出现更大的容器,那么这两条相同的线一定都会小于大容器的两条线,因此无论先移动左侧还是右侧的线,另一条线之后都需要移动。双指针遍历:容量计算公式为。
2024-03-02 21:13:50 374
原创 leetcode 热题 100_移动零
双指针遍历:类似快速排序,以0作为参照点,将不等于0的值放到左边,将等于0的值放到右边 (二者交换),参考下图(来源。双指针遍历:将非零的值往数组前端依次放置,将放置之后数组后端多余的位置都置为0,参考下图(来源。
2024-03-01 23:41:04 421
原创 leetcode 热题 100_最长连续序列
哈希表:找连续最长的数字序列,很容易联想到排序,但排序的时间复杂度O(nlogN)过大,判题容易超时。因此我们需要使用哈希表来快速查找,序列中是否存在与某个数相邻的数。用HashSet建立哈希表并去重,为了降低同一连续序列中重复查找的次数,我们先判断一个数字是否是连续序列的第一个值,如果是则循环搜索之后连续的值,如果不是则跳过。同时维护一个最长序列长度并返回。
2024-03-01 22:35:41 423
原创 leetcode 热题 100_字母异位词分组
计数:对两个字母异位词,二者包含的字母和字母数是一样的,因此可以对26个字母进行计数,得出类似“a3b4c5”的字符串作为HashMap哈希表的键值,将多个异位词存储在相同键值下进行分组,最后返回。排序:对两个字母异位词,二者排序后的字符串完全一样,因此可以对所给字符串进行排序,以排序后的字符串作为HashMap哈希表的键值,将排序前的字符串作为值进行存储分组,最后返回。
2024-02-29 22:55:32 414 1
原创 LeetCode 热题 100_两数之和
用HashMap哈希表存储下标和值,题目告诉我们只有唯一解,并且是不同下标的两个值,因此可以遍历数组,先判断哈希表中有没有符合条件(和为target)的值,如果有直接返回,如果没有就往哈希表中填入这个下标和值。
2024-02-29 20:42:55 436
原创 从零开始刷力扣——统计数组中的元素
645. 错误的集合697. 数组的度448. 找到所有数组中消失的数字442. 数组中重复的数据41. 缺少的第一个正数
2023-09-23 12:16:15 30
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人