![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣hot100
力扣100题
不会编程的屁屁桃
硕士在读,记录学习状态,共勉
展开
-
25.删除链表中倒数第N个结点
此题的重点是双指针法,定义快慢指针,题目要求删除倒数第n个结点,那么先让快指针移动到第n个结点,然后再让快慢指针一起移动,直到快指针移动到NULL,此时慢指针就移动到了倒数第n个结点。又因为如果要删除一个结点,需要找到该结点的上一个结点,所以让快指针移动到第n个结点后,再往下移动一个结点,上述操作后,慢指针就会移动到被删除结点的上一个结点。核心思想是,假设有10个数,我想找到倒数第二个数,那么先单独移动两次(正向),然后再一起移动(10-2)次,也就是移动八次,找到倒数第二个也就是正数第八个。原创 2024-03-21 22:13:32 · 696 阅读 · 0 评论 -
24.两数相加
思路:定义sum,以及新链表,while循环中,从左往右对应结点相加的结果给sum,然后sum%10得到个位也就是新链表的第一位,sum/10作为进位的值也就是新的sum,放到下一次相加中。l1的最后一个数9(l1)+1(sum)=10 写0 进1(sum) ,此时l1、l2都是null,但是sum是1,所以还要进入循环,把sum放到新链表的下一个结点中。while循环的条件是l1 || l2 || sum ,只要这仨有一个不为0就继续循环,把相加的结果添加到新链表中。的链表,表示两个非负的整数。原创 2024-03-21 22:01:42 · 289 阅读 · 0 评论 -
23.合并两个有序链表
思路:新建一个虚拟头节点,也就是新的链表。然后在while循环里面,两个指针同时遍历两个链表的结点,然后比较,把value值小的结点取出来接到新链表当前节点的next,然后小的那个往后移动一个节点,继续比较。while循环的条件是l1 l2都不为空指针,当有一个为空指针时,退出循环,把另一个链表的剩余部分接到新链表中。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。原创 2024-03-21 21:44:13 · 174 阅读 · 0 评论 -
22.环形链表Ⅱ
思路:跟上一题一样,先判断有无环,如果有环,再根据同样时间、不同速度走过的长度关系,列公式。有环的话,假设在环的右下角那个点相遇。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。返回索引为 1 的链表节点。如果链表无环,则返回。,则在该链表中没有环。原创 2024-03-19 11:49:03 · 203 阅读 · 0 评论 -
21.环形链表
思路:可以联想,两个人在操场跑圈,一个快的一个慢的,如果他俩相遇,则说明有环,而且一定是在环内相遇。本题用快慢指针来解决。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。原创 2024-03-19 10:25:54 · 324 阅读 · 0 评论 -
20.回文链表
思路:把链表结点的元素复制到数组中,然后双指针比较。给你一个单链表的头节点。,请你判断该链表是否为。原创 2024-03-18 20:40:55 · 200 阅读 · 0 评论 -
19.反转链表
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。可以把tmp=cur->next 理解为把tmp指针移动到cur的下一个结点。把cur->next=pre理解为cur节点的箭头指向pre节点。其实本质都是指针间的赋值操作,只不过这样理解比较直观一些。cur=temp 把cur移动到temp的位置。pre=cur 把pre移动到cur的位置。1.while的循环条件是cur,很巧妙。2.在链表操作时,为了直观理解,题意:反转一个单链表。原创 2024-03-18 16:32:14 · 160 阅读 · 0 评论 -
18.相交链表
分别定义两个指针,p和q,把链表a和b的头指针赋值给p、q。然后让p、q挨个往下一个结点移动,如果移动到null就从切换到另外的链表头结点继续移动。直到p和q相等,也就是移动到相同的位置,此时的p或q就是相交的结点位置。然后返回p或q,就算俩链表不相交,也没事,最终返回的大不了是null。,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。原创 2024-03-16 21:59:41 · 293 阅读 · 0 评论 -
17.搜索二维矩阵Ⅱ
编写一个高效的算法来搜索。思路:暴力解法,直接搜索。原创 2024-03-16 15:22:53 · 414 阅读 · 0 评论 -
16.旋转图像
旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。思路:先对角线两边互换,再中心线两侧互换。使用另一个矩阵来旋转图像。原创 2024-03-16 11:05:57 · 322 阅读 · 0 评论 -
15.螺旋矩阵
所以每次遍历完一条边界后,要把该边界先向内移动一个单位,同时判断是否超过了对面的边界,如果超过了,就break,退出循环。思路:定义上下左右四条边界,然后按上、右、下、左的顺序挨个遍历,每遍历完一条边界,就立即把该边界收缩一个单位。如图所示,上边界遍历完后(1、2、3、4),就要往下移动上边界,遍历完右边界,往左移动一个单位,再遍历下边界11、10、9。然后下边界往上移动一个单位,遍历左边界,此时只有5了。左边界往右移动一个单位,开始第二轮,遍历上边界6、7。然后再遍历右边界的元素8、12。原创 2024-03-15 17:28:16 · 367 阅读 · 0 评论 -
14.矩阵置零
思路:定义两个数组,一个m长度,一个n长度。然后遍历矩阵的每个元素,如果遇到0,就把两个数组对应行和列的位置标记一下。然后重新遍历矩阵,如果遍历到标记元素对应的行或列,就把元素置0.,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。原创 2024-03-15 11:22:09 · 319 阅读 · 0 评论 -
13.除自身以外数组的乘积
定义r和l俩数组,r[i]表示nums数组中第i个元素之前的所有数的乘积,l[i]表示第i个元素之后的所有数的乘积,然后再用一个for循环,把r和l的数组元素对应相乘,就是符合条件的数组。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。原创 2024-03-14 22:08:07 · 188 阅读 · 0 评论 -
12.轮转数组
思路:先把整个数组反转,再把前k个数反转,再把剩下的反转,就可以得到符合条件的数组。注意:有可能给的K是大于数组长度的,所以要用K对数组长度取余。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。原创 2024-03-14 17:27:38 · 442 阅读 · 0 评论 -
11.合并区间
本质:排序后,先定义第一个数组为startend数组,然后只要下一个数组与它重叠,那么就扩展或者保持不变startend数组,如果下一个数组不和它重叠(无法合并),那么就把它放进结果数组里,下一个数组就是新的startend数组。①如果该数组的左区间大于start,说明startend数组与该数组无重叠,那么把startend数组添加到ans数组中,然后把该数组(第i个数组)变成新的startend数组。②如果该数组的左区间小于等于start,说明欸还startend数组有重叠,就更新end,原创 2024-03-14 17:20:08 · 194 阅读 · 0 评论 -
10.最大子数组和
如果i数字前面的数字构成的连续数组的最大和小于等于0,那么就对第i个数字结尾的数组最大和没有正向贡献,所以直接把第i个数字赋值给f(i)。如果大于0,则对本次最大和有贡献,前i-1个最大和加上当前第i个数字,赋值给f(i)。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。连续子数组 [4,-1,2,1] 的和最大,为 6。设f(i)表示以第i个数字结尾的连续子数组的最大和。注意:这个思路过于巧妙,还需要反复理解推敲。是数组中的一个连续部分。思路:动态规划 状态函数。原创 2024-03-13 22:23:59 · 142 阅读 · 0 评论 -
9.和为K的子数组
假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位置到第i个位置的元素之和。说明从第i+1个位置到第j个位置的连续子数组的和为k。在遍历的过程中,检查在map中是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,我们将对应的次数累加到结果中。在代码中,其实在遍历数组的每个数字时,map中存的历史前缀和相当于prefixSum[i],而当前数字的前缀和是prefixSum[j],所以用一个sum就可以表示。原创 2024-03-13 16:37:28 · 390 阅读 · 0 评论 -
8.找到字符串中所有字母异位词
然后在for循环中,定义滑动窗口的左指针为0,右指针为p.size()-1(也就是滑动窗口的最后一个字母),把右指针的字母记录到currcount数组中,并且判断此时currcount和count是否一致,如果一致,把此时的左指针添加到结果数组中。注意:记录滑动窗口中字母出现次数的数组在定义并初始化时,只初始化s字符串前n-1个(n为p字符串的长度)字母出现次数。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。原创 2024-03-12 11:26:03 · 170 阅读 · 0 评论 -
7.无重复字符的最长字串
2.在for循环中,如果r指针指向的元素在map中存在(说明字符串之前出现过该字符),并且同时满足l指针的位置小于等于之前字符的位置(即之前的字符在滑动窗口内),那么就让l指针移动到之前字符的下一个位置。本题使用双指针组成的滑动窗口以及哈希表的map(key表示字符,value表示在字符串中的下标)。l是左指针,r是右指针。在右指针指到重复元素的时候,并且滑动窗口里面还包含之前的重复元素,此时就要把左指针移到之前重复元素的下一个位置。此时,右指针指向a,发现map表里面有a,即发现了重复元素,但是。原创 2024-03-11 18:52:28 · 833 阅读 · 0 评论 -
6.三数之和
对b、c去重完后,此时left和right已经移动到了最后一个不重复的有效元素位置,下一个元素与该位置的元素是不相同的。去重就要求分别对a、b、c三个元素都要去重,因为三元组是元素的组合,假设遍历到a1时,满足条件的b、c有三组,a1的下一个位置a2的值等于a1,如果不对a去重的话,就会多出来三组重复的三元组。要注意,去重是要判断当前位置与前一位置(已经使用过)的元素是否相同,而不是判断当前位置与当前位置的下一个位置是否相同,因为下一位置有可能是符合条件的与当前位置相等的b元素,容易被错过。原创 2024-03-11 14:55:26 · 565 阅读 · 0 评论 -
5.盛最多水的容器
思路:该题的关键是假设已经找了两根线,如示例一所示,如果想找面积更大的线,只能使短的那根线往里靠。因为长的往里靠,如果是更长的,也没用,高度一直是短的一边,而且宽度还减小了,面积只能小于等于当前面积。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。然后计算面积,然后把短的线往里靠,继续更新面积即可。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。用双指针,起始分别指向两端。原创 2024-03-11 10:19:22 · 209 阅读 · 0 评论 -
4.移动零
快指针指向的元素如果不是零,就把该元素赋值给慢指针,快慢指针同时往后移动一个位置。思路:快慢指针,快指针遍历,把不是零的元素赋值给慢指针,是零的跳过去。快指针指向的元素如果是零,快指针往后移动一个位置,慢指针不动。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。快指针遍历完所有元素后,再补零就行。,编写一个函数将所有。原创 2024-03-10 21:58:37 · 197 阅读 · 0 评论 -
3.最长连续序列
2.for循环遍历set,对每个元素,先判断是不是序列的起点(看看set中有没有比它小1的数字),如果是起点,就定义x=i+1;用while循环查询set中有无比该元素大1的元素,如果有就让x++;,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。3.在while循环结束后,找ans和x-i的大值赋值给ans。1.定义一个set,把nums的所有元素放进去,并去重。思路:本题用哈希表的set比较方便,set可以去重。请你设计并实现时间复杂度为。给定一个未排序的整数数组。原创 2024-03-10 15:53:09 · 589 阅读 · 0 评论 -
2.字母异位词分组
在key对应的value中压入该字符串。(value是一个容器,push_back可以把需要的值添加到容器末尾。1.先新建map表,以字符串为key,字符串数组为value。遍历字符串数组,对每个字符串进行排序,排序后的字符串作为key,排序前的字符串添加到value中。2.然后定义一个二维字符串数组ans,遍历map,依次把map中的value字符串数组添加到ans中(push_back)。vector 和vector分别是一维字符串数组和二维字符串数组。原创 2024-03-10 11:27:25 · 321 阅读 · 0 评论 -
1.两数之和
本题呢,就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。如果没有符合条件的两个元素,就返回空数组,或者有多对符合条件的,只返回一对就可以。因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,原创 2024-03-10 11:13:26 · 163 阅读 · 0 评论