- 博客(32)
- 收藏
- 关注
原创 力扣 hot100 Day31
通过new创建新内存,引入dummy虚拟头节点方便记录,最后delete。注意边界条件的处理,只要两个链表还有数字或者还有进位,就不退出循环。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。需要注意,是逆序存储的数字,所以直接从头加起来就行。的方式存储的,并且每个节点只能存储。
2025-07-01 23:18:36
33
原创 力扣 hot100 Day30
逻辑很简单,但这里写的太冗杂了,因为要记录head,需要在head赋值后用cur复制,所以第一次判断不在循环里,很难看。这里用一个虚拟头节点,使得逻辑和格式简洁许多,最后返回时也能使用。新链表是通过拼接给定的两个链表的所有节点组成的。递归法,挺好理解的,适合面试用(估计也很难有简单题)将两个升序链表合并为一个新的。
2025-06-30 23:18:55
151
原创 力扣 hot100 Day29
根据这个可以得到,在快慢指针第一次相遇后,从head出发一个新的指针,与慢指针同一速度出发,必然相遇于环节点。无论a和c谁比较大,小的那个指针走到环节点时,另一个必然刚好比其多k圈,并相遇。m-2n-1不一定为正数,为了看着舒服,可以写为。slow走的距离为a+n(b+c)+b。fast走的距离为a+m(b+c)+b。,返回链表开始入环的第一个节点。很久没碰数学了,捯饬半天啥也没搞出来。给定一个链表的头节点。如果链表无环,则返回。
2025-06-29 21:04:13
216
原创 力扣 hot100 Day28
经典快慢指针判断是否存在环。实际上有环的话,永远无法到达nullptr,一快一慢总会相遇。,判断链表中是否有环。给你一个链表的头节点。
2025-06-28 23:10:16
188
原创 Games101 Lecture3,Lecture4
引入一个维度(无物理意义?),辅助表达平移,为零时,表示向量,不为零时,表示点(/w)本来这是对相机作做的变换,但所有物体都应该相对相机不变,所以所有物体都要跟着变换。将相机位置旋转到设定角度,对应矩阵,即将原有g旋转至-z,t旋转至y。反过来求比较方便,旋转矩阵皆为正交矩阵,求逆同样方便,转置即可。两个投影具体逻辑后面补充吧,效果感觉不符预期,不知道目的是什么。相机标准设定,位于原点,向上为y方向,指向-z方向。视图变换矩阵,先将相机位置移到原点,再设定好角度。,解决平移的特殊情况。
2025-06-28 17:14:44
132
原创 力扣 hot100 Day27
这里,先用快慢指针找到中点,比前面直接遍历计数更优雅,接着反转后半链表,将反转后的链表与前半链表对比即可。空间更省,但改变了链表,可以后续恢复。用栈其实略显麻烦,可以直接将链表数存在数组里从后到前比对,逻辑更清晰,不过懒得补充了。这里用栈存储前一半数据,后面再一一和栈里的数据进行比对,逻辑简单,需要O(n)空间。,请你判断该链表是否为回文链表。给你一个单链表的头节点。
2025-06-27 23:33:15
152
原创 力扣 hot100 Day26
逻辑很简单,先用tmp暂存下下个节点,再将下一个节点指向当前节点,最后cur和next移动即可。用pre和cur处理会更简洁,还不用额外处理第一个节点,不过本质是一样的,懒得贴了。注意要将第一个节点指向nullptr,否则就成环了。,请你反转链表,并返回反转后的链表。
2025-06-26 22:43:53
199
原创 力扣 hot100 Day25
思路很简单,先求出两个链表差值,将长的链表走过差值后,与短的一起移动,直至两者指向同一个节点或者到达边界。,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。主要还是熟悉对链表的操作。
2025-06-25 23:11:57
216
原创 力扣 hot100 Day24
右上角:往左martix变小,往下martix变大,可区分,可用。左下角:往右martix变大,往上martix变小,可区分,可用。要选择一个点,使得横向和纵向移动,martix能够有不同的变化。左上角:往右往下移动,martix值都变大,无法区分,不可用。右下角:往左往上移动,martix都变小,不可区分,不可用。在这个逻辑上遍历,就能顺利写出上面的代码来了。这种算法能在O(m+n)完成搜索,效率高。每行的元素从左到右升序排列。每列的元素从上到下升序排列。编写一个高效的算法来搜索。
2025-06-24 23:20:24
275
原创 力扣 hot100 Day23
另一种方法,用directions数组存方向信息,然后在越界时加一即可。感觉没什么特别的复杂的逻辑,但写半天没写出来。,返回矩阵中的所有元素。
2025-06-23 23:01:56
172
原创 力扣 hot100 Day22
逻辑就是,n层阶梯的方法完全由n-1和n-2两层的方法数决定,因为只有这两种可能。动态规划,相较于递归优化了很多,用三个变量轮换也节省了空间。你有多少种不同的方法可以爬到楼顶呢?
2025-06-22 23:55:04
88
原创 力扣 hot100 Day21
旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。直接旋转,也是硬找规律,可能更好找一点。先转置,后翻转,没啥说的,全靠找规律。使用另一个矩阵来旋转图像。
2025-06-21 23:40:58
201
原创 力扣 hot100 Day20
所以,将首行与首列的零情况单独用bool值存储,直到最后再进行处理,这样,用来标记的零值就不会被误判。但直接处理会出现这种情况:该行置零表示该行有零,但列处理时将这个零误视为原先的零值,导致错误。不是原地算法,利用两个数值存储各行以及各列是否有零,再遍历赋值即可。为了减少空间占用,利用首行首列存储该行列是否有零。,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。
2025-06-20 23:50:39
119
原创 力扣 hot100 Day19
符合空间要求的解法,挺绕的。逻辑在于,通过原数组存放信息,利用swap,将范围内n值存放在索引n-1处,这样,只需要找到第一个不符合要求的索引,即对应输出。因为最小的正整数,最大也就是n+1,所以这里采用哈希表存放n+1个可能结果的遍历过程,最后取最小值输出即可。空间复杂度不满足要求。为了应对重复数值,当交换两值相等时,不进行交换。,请你找出其中没有出现的最小的正整数。并且只使用常数级别额外空间的解决方案。给你一个未排序的整数数组。请你实现时间复杂度为。
2025-06-19 22:54:14
204
原创 力扣 hot100 Day18
对上面的代码进行了空间优化,首先利用result存储前缀积,然后利用一个tmp存储后缀积,同时实时更新result即可。的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组。前后遍历一遍,保存前缀积和后缀积,相乘就是所需结果。拿笔画一下就很清晰。之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。时间复杂度内完成此题。
2025-06-18 23:17:36
181
原创 力扣 hot100 Day17
三步翻转法,感觉是怎么想都想不出来的方法。空间复杂度为O(1),因为翻转只用了常数级空间。逻辑很简单,算一下就能得到规律。,将数组中的元素向右轮转。
2025-06-17 23:20:58
123
原创 力扣 hot100 Day16
逻辑简单粗暴,先按start值进行排序,维护一个tmp值,再遍历一遍判断是否更新tmp即可,最后在对应条件和结束时将tmp存进result。ai优化了一下,排序直接用sort就行,后面处理也简明了许多。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。
2025-06-16 23:49:56
157
原创 力扣 hot100 Day14
正确做法是,通过dp存储以num[i]结尾的最大序列值,通过maxn存储遍历过程中最大序列值。这样,就有了dp=(max(nums[i],dp+nums[i]))的递推关系,由于dp不总是所求值,即最大和的连续子数组不总是以nums[i]收尾,所以维护一个maxn值进行记录。思考中最大的难点在于,如果用dp保存前面数组中具有最大和的子数组,不能顺利推进递推关系。思路很简单,主要是逻辑的实现,求解跨越两边的数组时,直接遍历到头,没有什么特别的。并不比dp优秀,只是展示一下分治法的逻辑。分治法,比官解清晰点。
2025-06-14 23:33:54
158
原创 力扣 hot100 Day13
这里的思路是,哈希表need记录需要覆盖的字母,在此基础上window只记录需要判断的字母个数,当window[c]==need[c]时,valid加一,即刚满足个数需求时加一,避免后续重复。当valid等于不同字母数时,即表明各个字母都满足了次数要求。通过len记录了最短时的start,最后返回即可,通过substr实现。右指针不断右移,当满足要求时,左指针右移动,直至不满足要求。主要问题点在于,如何快速判断,窗口中的字母覆盖所需字母。所有字符的子串,则返回空字符串。好难,看了提示都写不出来。
2025-06-13 23:47:14
103
原创 力扣 hot100 Day12
中序遍历(Inorder Traversal)是二叉树遍历的一种经典方法,其顺序遵循 。通过递归实现,传递result参数更方便处理,避免拼接,所以额外实现了一个辅助函数。结果是 [1,2,3,4,5,null,8,null,null,6,7,9]方法很简单,先递归左节点,存中间节点,再递归右节点。很难用语言说清具体逻辑,自己走几个例子就清晰了。今天打游戏去了,挑个简单题糊弄一下。虽然是简单题,但基本忘光了。给定一个二叉树的根节点。
2025-06-12 23:48:04
231
原创 力扣 hot100 Day11
遍历一遍nums:当值大于队尾值时,循环移除队尾值,直至可以保持单调递减,目的在于,去除小于新进来的数的数,因为后面肯定用不上了;检查队首值索引是否已经超出范围,如果超出范围,自然没必要保留(因为严格按入队时间排序,检查队首足够);逻辑核心在于,利用deque对两端的快速操作,通过单调队列排除了不可能成为最大值的值,从而可以快速获取窗口内最大值(O(1) 获取最值,总体为O(n))。的滑动窗口从数组的最左侧移动到数组的最右侧。采用deque队列作为数据结构,因为可以O(1)操作头尾两端。
2025-06-11 23:47:13
96
原创 力扣 hot100 Day10
采用前缀和的思路,通过哈希表记录走过的数组总和出现的个数。这样呢,检索哈希表中(tmp-k)值,即符合要求的子串个数。值得注意的是,record[0]=1,这样才能记录当走过数组长度总和与k相等时的情况。本质上说,空间换时间嘛,利用哈希表存储符合要求的前缀和的个数,实现性能优化。加入对(tmp-k)值存在的判断,避免隐式插入导致空间浪费。子数组是数组中元素的连续非空序列。
2025-06-10 23:02:30
194
原创 力扣 hot100 Day9
滑动窗口,外循环右指针不断右移,内层进行判断,左指针在达到p长度后不断右移。通过哈希表记录两个指针间字母情况,实时更新。需要特别注意的是,得实时清理哈希表中个数为零的值,从而便于对比。这里record和tmp直接进行比较,相对耗时,可以考虑别的比较方式,不过懒得多写了。其实思路和上面是一样的,同样是滑动窗口,但这里采用定长数组记录字母数量,性能相对优化。的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
2025-06-09 22:48:20
195
原创 力扣 hot100 Day8
主要逻辑是,通过两个指针来作为窗口的边界,通过哈希表记录窗口字符个数。右边界不断右移,当右边界指向字符与窗口重复时,左边界右移,直到与右边界重复的字符从左边移出。在移动过程中,实时用哈希表记录窗口内字符数量。外循环为右边界右移,内循环是左边界右移,在外循环里更新结果。咋一看逻辑很简单,但还是有很多要分析的地方。,请你找出其中不含有重复字符的。一点思路没有,学习了滑动窗口。
2025-06-08 23:44:51
153
原创 力扣 hot100 Day7
这个方法反而更接近我一开始的想法,不过利用栈的特性,可以很好地解决小凹槽的问题。详细来说,栈中维护了一个单调递减数列,当遇到更高边时,弹出栈顶,利用存储的信息计算水量宽度。感觉逻辑并没有特别好概述,总体的逻辑大致可以这么说,指向更低点的一边向高点那边移动,这样可以保证水一定能够存储,而不会出现上面我的思路中,由于到了边缘而忽略了小凹槽的储水。起初的思路,两个指针从一端出发,利用一个指针右移找出凹槽,直至找到比左边高的点。在移动的过程中,可能会出现更高点,此时就变换移动的边,从而确保计算的储水都是有效的。
2025-06-07 23:43:12
303
原创 力扣 hot100 Day6
昨天的题目其实也是一个道理,而今天这道题具体来说,就是通过两个指针值与计算好的差值比较大小来决定左右指针的移动。双指针,至少这种从两头逼近的双指针,相比于直接嵌套循环,最大的优化在于,通过对两个指针移动逻辑的定义,剪枝掉了很多可能性。直接看逻辑其实也不复杂,先排序,方便后面处理,再固定一个值,对应第一层循环,接着对右边数字进行双指针操作。好的解法是用双指针,题目其实也自带了标签,但我实在想不出思路,总感觉要三指针了,只能直接看题解。没有思路,写了个三重循环,实在是太丑陋了,不放了。,判断是否存在三元组。
2025-06-06 23:38:46
126
原创 力扣 hot100 Day5
暴力解法,直接两重嵌套遍历所有可能性。直接遍历提交会超时,这里简单进行了剪枝,如果height[i]过低,无论横坐标多长都无法装更多水,则直接跳过内层循环。处理后可以勉强通过。实际上,当ij距离最远时,如果不改变最小边,那么水量将永远被限制,所以舍弃较短边相当于剪枝了一半的变化可能,从而大大提升了时间效率。双指针法,用两个指针从两边逼近。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。
2025-06-05 22:13:33
274
原创 力扣 hot100 Day4
但这个情况不可能发生:要么一开始,两者指向同一个非零值,要么nonZeroPos始终指向零值,因为如果i与nonZeroPos交换后,nonZeroPos必然指向刚刚交换过来的零或者i跳过的零,即两个指针中间必然都是零。显然,nonZeroPos一开始不总指向零,但此时nonZeroPos和i将一起++,直到两个指针一起指向一个零值,i继续向前,而nonZeroPos停滞,等待i找到下一个非零值与其交换。用nonZeroPos来存储下一个非零元素应该存放的位置,当i非零时,进行数据交换。
2025-06-04 23:52:46
183
原创 力扣 hot100 Day3
利用哈希集合可以实现O(n)的时间复杂度。将数组存在哈希集合里,就可以在O(n)的时间复杂度下随时判断是否存在某些数,如此只需要再遍历一遍,跳过存在num-1的值,循环判断是否存在num+1,就能得到最长序列了。奇怪的是效率反而远不如第一种方法,sort函数还是太强了。最直接的想法,先排序,再遍历,用tmp存储最长序列。注意对空数组和重复数字的判断。不过时间复杂度肯定不符合要求了,排序给复杂度干到了O(n log n),找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。128 最长连续序列。
2025-06-03 23:38:00
146
原创 力扣 hot100 Day2
同样是直接计数,不过处理的比第一种要灵活,通过string存放各个字母的数量的ASCII码,即使为多位数,仍不需要特殊处理,因为本质不是数字,而是char字符。利用质数相乘的唯一性,实现给各个字母分配权重。不过cpp提交超出了longlong的范围,测试用例比较夸张。通过对大质数取模处理,跑成功了,不过这样应该存在风险,不能保证百分比准确。无脑思路,通过string数组存储每个字符串的字母分布情况,结合哈希表进行分类存储,最后输出,最终效率感人。是由重新排列源单词的所有字母得到的一个新单词。
2025-06-02 23:16:01
140
原创 力扣 hot100 Day1
利用无序哈希表,存储时,num[i]作为键,对应索引作为值,这样,对于每个num[i],可以在O(1)情况下找到是否有符合要求的值。一种存储键值对的方法,也可以用insert或者emplace,推荐emplace。返回找到的索引以及当前索引,it->second即对于值,first则为对于键。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。it为迭代器,find函数找到则返回对应键,未找到则返回end()记录刷题过程,不完全是新手,但大差不差。整数,并返回它们的数组下标。
2025-06-01 23:04:18
151
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人