- 博客(35)
- 收藏
- 关注
原创 leetcode 146.LRU缓存
如果key已经存在于缓存中,就更新对应节点的value,并将节点移动到双向链表的头部;如果key不存在,就创建一个新的节点,并将节点加入到双向链表的头部,同时更新哈希表。整体思路是通过双向链表来维护最近的访问顺序,把最近使用过的数据放到链表头,这样链表尾时始终是最近最少使用的数据,同时用哈希表来实现O(1)时间复杂度的查找(缓存数据的键映射到其在双向链表中的位置)。在双向链表的实现中,使用一个 头部 head 和 尾部 tail 标记界限,这样在添加节点和删除节点的时候就不需要检查相邻的节点是否存在。
2024-03-20 20:45:27
467
原创 Leetcode 23.合并K个升序链表
思路是比较两个链表的头节点的值,将较小的头节点作为合并后链表的头节点,然后递归地合并剩下的部分。将所有链表两两合并,得到新的链表数组。继续重复这个过程,直到链表数组中只剩下一个链表。最后剩下的一个链表即为合并后的链表。时间复杂度为 O(Nlogk),其中 N 为所有链表的节点总数,k 为链表的数目。在每一轮合并过程中,需要遍历所有的节点。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。可以使用分治的方法来解决。
2024-03-15 20:16:21
462
原创 Leetcode 148.排序链表
直接把链表的值用vector存储,然后对值sort排序,再存回来。3、对分割后的两部分链表分别进行递归调用,继续进行归并排序。2、使用快慢指针找到链表的中点,将链表分为两部分。1、如果链表为空或只包含一个节点,直接返回即可。4、合并排好序的两个链表,返回合并后的链表。
2024-03-05 21:32:09
425
原创 Leetcode 138.随机链表的复制
这样,在设置拷贝链表节点的 next 和 random 指针时,可以根据原链表节点的指针关系,通过哈希表找到对应的拷贝链表节点。要实现深拷贝一个包含随机指针的链表,我们需要复制两部分,一个是原链表的结点,另一个是原链表的next指针和radom指针。第一次遍历原链表,创建对应的拷贝节点,并将原链表节点和拷贝链表节点分别作为键值对存入哈希表中。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。返回复制链表的头节点。
2024-03-05 20:44:08
453
原创 Leetcode 25.K个一组翻转链表
同时,我们将前一个组的尾节点 tail 指向当前翻转后的头节点 curr。然后,定义了两个指针 prev 和 curr 分别指向当前组的前一个节点和当前组的起始节点。最后,我们将尾节点 tail 的 next 指针指向下一个组的起始节点,以保持连接的连续性。弄一个指针,每次移动k步,反转这k个元素,对于每个分组,我们先判断它的长度是否大于等于。首先,我们使用 dummyHead`创建一个虚拟头节点,将其指向头节点 head。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
2024-03-05 19:53:49
341
原创 Leetcode 24.两两交换链表中的结点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。对于需要交换的两个节点,例如node->node1->node2,若要交换node1和node2,则。指针指向链表的头节点。
2024-03-05 10:06:02
353
原创 Leetcode 19.删除链表的倒数第n个结点
使用双指针,初始化两个指针fast,slow初始时指向head,将指针。指针指向的节点即为倒数第 n 个节点的前一个节点。指针指向倒数第 n 个节点的后一个节点,即。将倒数第 n 个节点的前一个节点的。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。然后,同时移动两个指针,直到。指针到达链表的末尾节点,即。向前移动 n 步,使得。指针领先 n 个节点。
2024-03-05 09:01:40
407
原创 Leetcode 2.两数相加
将相加的结果对 10 取余数,得到当前位的数值(创建一个新的节点,值为相加结果对 10 取余数。如果其中一个链表已经遍历完,而另一个链表还有剩余节点,则将剩余节点和进位值逐个相加,并连接到新链表的末尾。的当前节点的值x,y(若当前为空,则取0),并将它们相加,加上上一次的进位值。大于 0,则创建一个新节点,值为进位值,并连接到新链表的末尾。的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。分别指向两个链表的头节点,初始化一个额外的变量。,用于记录进位值的初始值为 0。
2024-03-05 08:20:26
419
原创 Leetcode 21.合并两个有序数组
直接创建一个新链表,遍历两个升序链表,将两个链表当前指向的值中的较小值先插入新链表。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。
2024-03-04 19:50:33
410
原创 Leetcode 142.环形链表 II
设链表共有 a+b 个节点,其中 链表头部到链表入口 有 a 个节点(不计链表入口节点), 链表环 有 b 个节点;从head结点走到入环点需要走 : a + nb, 而slow已经走了nb,那么slow再走a步就是入环点了。然后,两个指针同时移动,每次移动一步,直到两个指针相遇。可以推出s = nb,即 fast 和 slow 指针分别走了 2n,n 个环的周长。时, 两指针在环中第一次相遇,但是相遇的地方不一定就是环的入口。一样,都是通过快慢指针的方法来判断是否有环,关键是怎么确定环的入口。
2024-03-04 19:37:28
412
原创 Leetcode 141.环形链表
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。根据相遇的情况返回结果。仅仅是为了标识链表的实际情况。使用一个循环,每次将快指针。相遇,则链表中存在环,返回。如果链表中不存在环,快指针。将最终遇到链表的末尾,即。如果链表中存在环,快指针。,判断链表中是否有环。,分别指向链表的头节点。给你一个链表的头节点。
2024-03-04 17:22:34
363
原创 Leetcode 234.回文链表
一开始的想法是直接反转整个链表,但是提交的时候出错,比如case:1,1,2,1(不理解)。看网上说是整个反转后如果和原链表相同,是充分不必要条件,还是不理解。首先使用快慢指针找到链表的中间节点,将链表的后半部分翻转,然后比较翻转后的后半部分与原始链表的前半部分是否相同。通过这种方法,我们可以找到链表的中间节点。快慢指针相遇的位置即为链表的中点,这个中点可以用于将链表分为两部分。,请你判断该链表是否为回文链表。移动到链表末尾节点的下一个节点,即。假设链表的总长度为 n,快指针。当链表长度为偶数时,快指针。
2024-03-04 17:00:06
377
原创 Leetcoded 206.反转链表
比如说1,2,3,4,5,初始化 prev 为 NULL,curr 为 head(curr = 1 -> 2 -> 3 -> 4 -> 5),3、接着将 prev 指针指向 curr,将 curr 指针指向 next,继续迭代移动到下一个节点。迭代法的思路是使用三个指针 prev、curr 和 next,来逐个反转链表中的节点。2、然后将 curr 的 next 指针指向 prev,实现当前节点的反转。返回 5 -> 4 -> 3 -> 2 -> 1,即为反转后的链表。将反转后的头节点作为新的头节点返回。
2024-03-04 15:48:51
415
原创 Leetcode 160.相交链表
请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。,函数返回结果后,链表必须。
2024-03-04 14:00:51
1411
原创 Leetcode 240.搜索二维矩阵 II
我们从矩阵的右上角开始搜索。这里选择右上角是因为,从这个位置开始,往左的元素都比当前元素小,往下的元素都比当前元素大(有点二分搜索的意思),因此我们可以利用这一性质逐步接近目标值。如果当前元素大于目标值,则说明目标值可能在当前元素的左边,因此往左移动一列继续搜索。如果当前元素小于目标值,则说明目标值可能在当前元素的下边,因此往下移动一行继续搜索。对于当前元素,如果它等于目标值,则说明找到了目标,直接返回true。重复上述过程,直到超出矩阵的边界,表明没有找到目标值。编写一个高效的算法来搜索。
2024-03-04 13:37:03
424
原创 Leetcode 48.旋转图像
因此,对于矩阵任意第 i 行、第 j 列元素 matrix [ i ] [ j ] ,矩阵旋转 90º 后「元素位置旋转公式」为:matrix [ j ] [ n - 1 - i ]。对矩阵进行转置操作,即将矩阵的行与列进行互换。即将(i, j)元素与(j, i)元素进行交换。旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。对转置后的矩阵进行逐行反转操作。使用另一个矩阵来旋转图像。
2024-03-01 19:55:13
385
原创 Leetcode 54.螺旋矩阵
用于存储按照顺时针螺旋顺序输出的矩阵元素。1、从下到上,遍历左边界,将对应位置的元素加入结果数组,然后左边界列索引加1。2、从右到左,遍历下边界,将对应位置的元素加入结果数组,然后下边界行索引减1。从左到右,遍历上边界,将对应位置的元素加入结果数组,然后上边界行索引加1。从上到下,遍历右边界,将对应位置的元素加入结果数组,然后右边界列索引减1。按照顺时针螺旋顺序输出矩阵中的所有元素,初始化一个结果数组。进入循环,循环条件为当前已经按顺时针存储的元素个数。,返回矩阵中的所有元素。
2024-03-01 19:27:56
409
原创 Leetcode 73.矩阵置零
遍历矩阵中的每个元素,如果某个元素为0,将需要置零的行和列的信息保存到第一行和第一列中,根据第一行和第一列的信息,我们更新整个矩阵,该置零的置零。实际上就是多开两个数组row和col,分别记录哪些行和列需要置零,遍历矩阵中的每个元素,如果某个元素为0,将对应的。实际上和上面的做法是一样的,不同的是没有再用额外的空间,而是用矩阵的第一行和第一列来表示相应行和列是否需要置零。数组中的元素置为1,表示对应的行和列需要置零。,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。
2024-03-01 17:14:27
355
原创 Leetcode 41.缺失的第一个正数
题目是找缺失的第一个正数,最想要的肯定是先进行排序,有序了就很好处理了,所以就要找出一种满足时间复杂度为。所以这里使用一种交换排序的思想,对于数组内的某一个元素 nums[ i ] ,将其交换到数组的第。并且只使用常数级别额外空间的解决方案,不然其实很简单。实际上就是通过交换来达到一定的有序。,请你找出其中没有出现的最小的正整数。并且只使用常数级别额外空间的解决方案。并且只使用常数级别额外空间的排序。再次遍历数组,找到第一个位置。给你一个未排序的整数数组。就是未出现的最小正整数。请你实现时间复杂度为。
2024-03-01 16:14:02
469
原创 Leetcode 238.除自身以外数组的乘积
第二次遍历,从右到左,计算每个元素右侧所有元素的乘积,并与之前计算的左侧乘积相乘,得到最终结果。的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组。第一次遍历,从左到右,计算每个元素左侧所有元素的乘积,并保存到对应位置的。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。为左侧乘积乘以右侧乘积。之外其余各元素的乘积。左侧所有元素的乘积。
2024-03-01 10:34:53
410
原创 Leetcode 189.轮转数组
具体来说,在进行循环右移时,我们需要将原始数组中的元素按照偏移量 k 向右移动。对于索引i,我们可以使用 (n - k + i) % n 来获取在右移后元素应该放置的位置。直接调用reverse函数先对数组进行整体旋转,再将前k个元素转回来,后面n-k个元素转回来,计算k对数组长度取余,以防止k大于数组长度。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100。,将数组中的元素向右轮转。
2024-03-01 10:06:51
640
原创 Leetcode 56.合并区间
如果当前区间与结果数组中的最后一个区间有重叠,即当前区间的起始位置小于等于结果数组中最后一个区间的结束位置,那么它们可以合并。更新结果数组中最后一个区间的结束位置为当前区间的结束位置和结果数组中最后一个区间的结束位置中的较大值。如果当前区间与结果数组中的最后一个区间没有重叠,即当前区间的起始位置大于结果数组中最后一个区间的结束位置,那么它们不能合并。首先,按照区间的起始位置进行排序,以确保区间按照起始位置的升序排列。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。,用于存储合并后的区间。
2024-02-29 23:47:52
382
原创 Leetcode 53.最大子数组和
请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。,计算将其加入当前子数组的和是否大于该元素本身。如果大于,则更新当前子数组的和为。连续子数组 [4,-1,2,1] 的和最大,为 6。在每次迭代中,更新全局最大子数组和。的解法,尝试使用更为精妙的。,否则,将当前子数组的和更新为。是数组中的一个连续部分。如果你已经实现复杂度为。
2024-02-29 22:46:30
380
原创 Leetcode 76.最小覆盖子串
在缩小窗口的过程中,不断更新窗口的最小长度和起始位置。内循环中,通过移动左指针left来缩小窗口,每次移动后都需检查是否依然满足包含t中所有字符的条件。如果拓展的字符c是t中的字符,我们就更新窗口内字符c出现的次数,同时检查是否已经满足包含t中所有字符的条件。right向右移动扩展窗口,直到满足包含t中所有字符的条件。创建两个哈希表,一个用于存储t中每个字符出现的次数,另一个用于存储滑动窗口内每个字符出现的次数。最终返回最小覆盖子串的起始位置和长度,或者空字符串(如果找不到这样的子串)。
2024-02-29 22:26:06
356
原创 Leetcode 239.滑动窗口最大值
对于此题,使用双端队列维持一个滑动窗口,若队列中的元素个数超过了窗口大小k,那么窗口向右移动,即弹出队列最左侧的元素,对于加入队列的元素,可以通过保持队列的单调性,即队列中的元素按照它们在数组中的值从大到小排列。也就是说,如果当前元素大于队列中的元素值,那么需要将队列中的元素依次弹出,直到队尾元素大于等于当前元素,然后将当前元素加入队列,再将其索引 i 加入队列。可以随时从头添加或删除元素,也可以随时从末尾添加或者删除元素,而不用保证先入先出,这样就可以方便滑动窗口在移动过程中队窗口内元素的删除和增加。
2024-02-29 19:20:06
341
原创 Leetcode 560.和为k的子数组
数组preSum[i]就表示从 nums[0~i] 间所有数的和,即 preSum[i] = preSum[i - 1] + nums[i - 1],这时如果要计算区间 [i,j] 的子数组的和,就等于 preSum[j] - preSum[i],题目要求返回 该数组中和为。在每次迭代中,查找前缀和preSum - k(其实就是上面的preSum[j] - preSum[i] == k,就是看在哈希表中有几个preSum[i] )在哈希表中出现的次数。子数组是数组中元素的连续非空序列。
2024-02-29 15:39:15
411
原创 Leetcode 438.找到字符串中所有字母异位词
首先,准备两个哈希计数数组target和window,分别用于记录字符串p中字符的计数和窗口中字符的计数。如果窗口中某个字符的计数超过了目标字符数组中对应字符的计数,表示该字符不符合要求,左指针向右移动,缩小窗口。然后,通过不断移动左右指针来构建滑动窗口,找出满足条件的子串,即滑动窗口window中的元素个数和target数组中的个数一致。当窗口的大小等于p的长度时,表示找到一个完全匹配的子串,记录下左指针的位置,即为子串的起始索引。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
2024-02-28 23:03:12
369
1
原创 Leetcode 3.无重复字符的最长子串
可以想象成一个窗口,从数组开始不断向右滑动,使用滑动窗口的算法能够在每次迭代中只考虑一个字符的增加或删除,从而减少了不必要的计算。5. 在内层循环中,通过r向右扩展窗口,直到窗口的右边界r+1对应的字符在集合str中已经存在,或者到达字符串的末尾为止。根据窗口的左右指针计算窗口的长度r-i+1,并将其与之前的最大长度ans进行比较并更新。7. 重复步骤4-6,直到遍历完整个字符串s,即得到最长无重复子串的长度ans。2. 初始化窗口的左指针i为0,右指针r为-1,代表初始窗口大小为0。,所以其长度为 1。
2024-02-28 22:41:13
484
原创 Leetcode 42.接雨水
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。
2024-02-28 22:21:04
393
原创 Leetcode 15.三数之和
当出现满足nums[i]+nums[l]+nums[r]=0的情况时,则将这个三元组添加到答案中,并且左右指针移动。题目说明输出的顺序和三元组的顺序并不重要,那么就可以先对数组进行排序,题目要求是三数之和,这样我们可以枚举出一个数来作为三元组中的第一个数nums[i],问题就转化成了在剩余的nums[i+1~n]中寻找另外两个数nums[l]和nums[r],使得nums[i]+nums[l]+nums[r]=0。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。唯一可能的三元组和为 0。
2024-02-28 20:28:54
355
原创 Leetcode 11.盛最多水的容器
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。
2024-02-28 17:28:32
400
原创 Leetcode 283.移动零
这题其实很简单,就是多用一个数组,把非零元素按顺序先存起来,然后再后面补零就可以了。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。你能尽量减少完成的操作次数吗?,编写一个函数将所有。
2024-02-28 17:13:47
434
原创 通过百度地图API在地图上批量添加点标注
通过导入Excel文件(包含一列需要标注的地址),通过百度地图经纬度转换得到需要标注地点的经纬度(保存在经纬度.xlsx),然后再通过导入经纬度.xlsx通过百度地图api批量在地图上标注地点。得到自己的ak,放到下面代码的相应位置就好了。首先先到百度地图开放平台。
2024-02-28 15:54:28
6986
2
原创 Leetcode 128.最长连续序列
用暴力的话实际上就是进行了很多重复的判断,比如说数组是32415,从3开始算一遍345,然后是2345,45,然后到1又算了一遍12345,其实每次都从序列里面最小的那个数开始判断就可以了,这样就避免重复计算了。如果序列为空,那么最长序列长度为0,如果序列只有一个元素,那么最长序列长度为1,如果下一个元素与当前元素相等,直接跳过判断下一个元素,当出现不连续元素的时候,将当前连续序列长度置为1,继续判断就好了。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为。
2024-02-28 15:12:22
390
原创 Leetcode 49.字母异位词分组
用map来存储,使用sort来对字符串数组中的每一个字符串进行排序,排序后如果字母全部相同,那么肯定就是一个字母异位词,将排序过后的字符串作为map的键值,这样具有相同字母的字符串归类到同一个字符串数组。异位词就是组成的字母相同,排列不同,所以可以对字符串进行排序。是由重新排列源单词的所有字母得到的一个新单词。可以按任意顺序返回结果列表。给你一个字符串数组,请你将。
2024-02-28 11:32:02
479
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅