- 博客(28)
- 收藏
- 关注
原创 算法小解:24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。注意终止条件为pre.next == null 或者 pre.next.next == null。
2024-07-15 15:30:34
112
原创 算法小解:19. 删除链表的倒数第 N 个结点
解:如何定位倒数第 N 个结点,双指针(分别为 end 和 start ,start在前),它们之间的间隔为N,先让start先走 N 步,之后同时前进。直到start为null时,end会停在倒数第 N 个结点。通过endPre.next = end.next实现删除倒数第 N 个节点。提问:假如图中的N = 3呢,由于没有Pre如何删除起始节点呢?给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。答:我们可以在一开始。
2024-07-08 15:25:10
316
原创 算法小解:2. 两数相加
解:遍历链表,构建一个标志位oneStep表示是否需要进位,通过建立两个零时变量val1和val2来获取链表的值,如果节点为空的话就设为0,ans_val = val1 + val2 + oneStep,oneStep = ans_val / 10,ans_val %= 10(一个节点。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点。
2024-07-08 10:54:29
201
原创 算法小解:142. 环形链表 II
解:假设非环形部分长度为 a ,环形部分长度为 b ,快指针的步长为f,慢指针的步长为s,且。其实不需要确定,让快指针从head节点开始且步长改回1,他们两会同时到达入环的第一个节点的。能够看到,快指针和慢指针只需要再走。,返回链表开始入环的第一个节点。给定一个链表的头节点。,这两个公式能够推导出。如果链表无环,则返回。
2024-07-02 15:14:29
124
原创 算法小解:141. 环形链表
如果链表存在环,则快指针和慢指针一定会相遇,如果不存在环,快指针会遇到空节点。,快慢指针的相对速度为1。也就是每次移动他们之间的距离差会减少1。思考:在循环链表中会不会存在。,判断链表中是否有环。给你一个链表的头节点。
2024-07-02 14:09:23
288
原创 算法小解:234. 回文链表
使用 slow 和 fast 指针,同时指向头节点,但步长分别为 1 和 2 ,最终,slow指针会指向链表后半部分的起始节点,(注意:递归条件为fast!= null,奇数长度的链表,slow指针最后需要再往前走一步),反转后半部分的链表。最后对比前后链表即可。,遍历链表,将节点存到数组中,建立头尾指针(left和right)同时相向遍历,如果arr[left++]!= arr[right--]则不是回文链表。,请你判断该链表是否为回文链表。给你一个单链表的头节点。
2024-07-02 11:19:14
252
原创 算法小解:73. 矩阵置零
解:原地算法,用O(1)的空间,用第一行和第一列分别取存储需要置0的行和列,针对要不要对第一行和第一列是否置0,可以建立标志位来标识是否置0。,建立两个集合 row 和 col,分别去存储那些行和列是要置0的。,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。
2024-07-01 11:18:05
270
原创 算法小解:160. 相交链表
解:A链表和B链表长度分别为 a 和 b ,假设存在相交链表且这公共部分的长度为 c ,建立两个 potinerA 和 potinerB ,这两个指针都是一个时间单位移动一长度,同时移动,potinerA走完了A链表后走B链表当走到公共部分时走了 a + (b - c),同理potinerB走完了B链表走A链表当走到公共部分时走了 b + (a - c),由于。,用集合存储其中一个链表的所有元素,遍历另一个链表的元素时查看集合中是否存在该元素,如果存在则相交。如果两个链表不存在相交节点,返回。
2024-06-27 09:22:08
224
原创 算法小解:240. 搜索二维矩阵 II
解:将矩阵逆时针旋转45°,可以看到一个类似二叉搜索树,以右上角为 “根” 节点,如果比target大进入左子树(j--),如果比target小进入右子树(i++)。,每一行取寻找是否存在target。每行的所有元素从左到右升序排列。每列的所有元素从上到下升序排列。编写一个高效的算法来搜索。
2024-06-25 17:01:14
151
原创 算法小解:54. 螺旋矩阵
定义四个边界top,right,bottom,left。顺时针遍历矩阵时,如果撞墙了,更换方向,并且收缩自己遍历的那个边界,(比如说1 -> 2 -> 3,遇到了right,跟换遍历方向,并且收缩top边界(top++))。直到边界收缩到top > bottom或者left > right。,返回矩阵中的所有元素。
2024-06-25 10:46:38
264
原创 算法小解:48. 旋转图像
解:原地旋转 d -> a,c -> d,b -> c,b -> a,在这个覆盖顺序中,a被d覆盖了,可以用一个临时变量存a。相当于将矩阵分4部分(左上,右上,左下,右下)进行操作,只需要对左上进行操作即可。取 1 / 4 的矩阵,偶数长度矩阵取 n / 2 行, n / 2。奇数取 n / 2 行 ,(n+1) / 2列(或者 (n + 1) / 2行, n / 2列)。旋转图像,这意味着你需要直接修改输入的二维矩阵。(题目要求不要用)用一个新矩阵帮助列转行。使用另一个矩阵来旋转图像。
2024-06-25 10:27:22
146
原创 算法小解:41. 缺失的第一个正数
解:遍历nums,根据f(nums[i]) = nums[i] - 1,nums[i] - 1为新的坐标,如果0
2024-06-24 09:40:49
287
原创 算法小解:238. 除自身以外数组的乘积
解:前后缀相乘,定义两个数组:temp_left[ i ] 表示第 i 个元素的前缀 [0, i - 1] 的乘积,temp_right[ i ] 表示第 i 个元素的后缀 [i + 1, nums.length - 1] 的乘积。优化:可以看到求后缀乘积的同时就可以获取ans了,求前缀乘积的时候就可以存到ans,之后用tmp变量存储当前后缀乘积即可。之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。时间复杂度内完成此题。
2024-06-21 15:31:51
137
原创 算法小解:56. 合并区间
解:排序左端点,根据判断右端点是否在后一个区间内来进行合并(创建一个新数组用于存储合并区间),如果不在,证明已经合并完成,将新的区间添加到新数组中。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。
2024-06-19 17:32:20
138
原创 算法小解:53. 最大子数组和
解:动态规划,定义dp数组,dp[i] 表示以 i 为结尾的最大子数组和,如果dp[i - 1]小于零dp[i]为nums[i],否则为dp[i - 1] + nums[i],即为dp[i] = dp[i-1] < 0?优化:能看到每次求出dp[i]只需要被使用一次,所以可以不用数组存储,换为dp变量即可,表示当前的以i为结尾的最大子数组和。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。:是数组中的一个连续部分。
2024-06-19 11:31:43
116
原创 算法小解:76. 最小覆盖子串
解:使用滑动窗口和哈希表,首先记录 t 字符串中的字符出现次数,建立left和right指针,right指针遍历 s 字符串并统计 s 串的字符出现字数,并且判断是否[left, right]区间是否涵盖 t 字符串,如果涵盖,进行子串长度比较(right - left < ansLeft - ansRight),如果比之前的子串小就赋值并且移动 left 指针以此往复直到不涵盖 t 字符串。(是否涵盖t字符串判断能继续优化)所有字符的子串,则返回空字符串。所有字符的最小子串。
2024-06-18 11:53:38
287
原创 算法小解:239. 滑动窗口最大值
所以只能使用xj+1 = max(nums[i + 1 ... j + 1]),但是每次比较都需要O(k)的实践复杂度,可以使用单调队列(单调递减)解决,每次添加元素的时候如果nums[i]就在队首的话就删除,没有的话证明之前的最大值还在窗口中,然后就是将比nums[j + 1]的元素删除掉,最后添加在队尾保证单调递减。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口每次只向右移动一位。
2024-06-17 17:28:13
207
原创 算法小解:560. 和为 K 的子数组
hashmap.merge(key, value, remappingFunction):如果 key 对应的 value 不存在,则返回该 value 值,如果存在,则返回通过 remappingFunction 重新计算后的值。,使用一个数组s记录前缀和,寻找和为k的子数组只需要知道s[i] = s[j] - k(i < j)是否存在值为s[i]的前缀和,如果存在就查看有多少个这样的前缀和(用哈希表记录)即可。优化:可以s只需要使用一次就可以了,所以不需要使用数组记录。
2024-06-17 13:57:52
177
原创 算法小解:3. 无重复字符的最长子串
解:利用哈希表和滑动窗口,右指针遍历字符串并将字符存入,如果存在就变动左值针left =“abba”,当遍历到第二个“a”的时候,左指针又跳回到左边的a上去了,防止往回跳。,请你找出其中不含有重复字符的。
2024-06-13 17:10:15
136
原创 算法小解:42. 接雨水
优化:使用max_left[],max_right[]两个数组,分别去存该列的左右两边最高的柱子,我们只需要通过比较前面列的最大高度柱子和当前柱子高度比对一次max(max_left[ i - 1], height[i - 1])和max(max_right[i + 1], height[i + 1]),也就是只需要遍历一次。解法:求每一列可以容纳的雨水量,通过找到这一列的左右两个最高柱子,然后取最小的即可。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。
2024-06-13 16:21:30
293
原创 算法小解:15. 三数之和
解:数组排序,然后分为三个指针min、mid、max,分别指向小中大的值,用min遍历数组,在(min + 1, max)进行筛选,mid左边界,max右边界,和值为sum,sum > 0移动右指针,sum < 0移动左指针,sum = 0记录并同时移动左右指针。注意:保证不重复可以在移动指针的同时观察和之前值是否相等(重复了)。比如遍历min指针时,观察nums[min - 1] = nums[min]是否相等,相等就跳过。,判断是否存在三元组。
2024-06-13 11:11:32
143
原创 算法小解:11. 盛最多水的容器
解题:使用双指针,一个left(位于左边界)一个right(位于右边界)。容量的计算公式:min(height[i], height[j]) * (i - j),假如短板是i所指向的,考虑两种情况:1. 移动短板:min(height[++i], height[j])是有可能比之前大的。2. 如果移动长板min(height[i], height[++j])一定是比小于或者等于之前的。所以我们选择移动短板。终止条件为两指针相遇。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。
2024-06-06 17:30:57
145
原创 算法小解:283. 移动零
解答:使用双指针,指针分别为left和right,用right遍历数组:1.如果遇见非零元素就开始给left指向的元素赋当前元素的值,并且移动left指针+1。2:如果遇见零元素就忽略。(right和left一起移动,直到有零元素,left就会被卡住,需要等到right遇到非零元素left才能移动,这样遍历完之后不仅可以保证[left, right)这个区间是0元素,还能保证非零元素的相对位置。,同时保持非零元素的相对顺序。
2024-06-06 11:23:53
127
原创 算法小解:128. 最长连续序列
解答:使用HashSet解决,将nums的所有元素存入其中,针对如何获取连续序列的长度,我们需要知道每个连续序列的的开头,这个开头元素可以通过判断该元素在。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。,如果没有就是连续数组的开头。请你设计并实现时间复杂度为。给定一个未排序的整数数组。
2024-06-03 15:47:55
206
原创 算法小解:49. 字母异位词分组
解答:可以使用HashMap解决,遍历String数组的时候,对每个元素进行排序(bac -> abc),排序后的字符串为key,然后给这个key的value创建一个数组然后在里面添加元素。computeIfAbesent:如果存在对应的value会返回该value,没有就会使用获取 remappingFunction 重新计算后的值,并保存为该 key 的 value。是由重新排列源单词的所有字母得到的一个新单词。(例子:abc、bac、cab这些都是字母异位词)给你一个字符串数组,请你将。
2024-06-03 15:05:28
261
原创 算法小解:1.两数之和
解答:我们可以利用hashmap来解决,遍历nums的同时将元素存在map里面,同时我们去判断target-当前元素 是否在map中(先判断再将该元素存进map中),存在就结束哩!整数,并返回它们的数组下标。,请你在该数组中找出。
2024-06-03 14:16:58
168
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人