自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 25.删除链表中倒数第N个结点

此题的重点是双指针法,定义快慢指针,题目要求删除倒数第n个结点,那么先让快指针移动到第n个结点,然后再让快慢指针一起移动,直到快指针移动到NULL,此时慢指针就移动到了倒数第n个结点。又因为如果要删除一个结点,需要找到该结点的上一个结点,所以让快指针移动到第n个结点后,再往下移动一个结点,上述操作后,慢指针就会移动到被删除结点的上一个结点。核心思想是,假设有10个数,我想找到倒数第二个数,那么先单独移动两次(正向),然后再一起移动(10-2)次,也就是移动八次,找到倒数第二个也就是正数第八个。

2024-03-21 22:13:32 690

原创 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 283

原创 23.合并两个有序链表

思路:新建一个虚拟头节点,也就是新的链表。然后在while循环里面,两个指针同时遍历两个链表的结点,然后比较,把value值小的结点取出来接到新链表当前节点的next,然后小的那个往后移动一个节点,继续比较。while循环的条件是l1 l2都不为空指针,当有一个为空指针时,退出循环,把另一个链表的剩余部分接到新链表中。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。

2024-03-21 21:44:13 168

原创 22.环形链表Ⅱ

思路:跟上一题一样,先判断有无环,如果有环,再根据同样时间、不同速度走过的长度关系,列公式。有环的话,假设在环的右下角那个点相遇。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。返回索引为 1 的链表节点。如果链表无环,则返回。,则在该链表中没有环。

2024-03-19 11:49:03 200

原创 21.环形链表

思路:可以联想,两个人在操场跑圈,一个快的一个慢的,如果他俩相遇,则说明有环,而且一定是在环内相遇。本题用快慢指针来解决。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。

2024-03-19 10:25:54 321

原创 20.回文链表

思路:把链表结点的元素复制到数组中,然后双指针比较。给你一个单链表的头节点。,请你判断该链表是否为。

2024-03-18 20:40:55 198

原创 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 157

原创 18.相交链表

分别定义两个指针,p和q,把链表a和b的头指针赋值给p、q。然后让p、q挨个往下一个结点移动,如果移动到null就从切换到另外的链表头结点继续移动。直到p和q相等,也就是移动到相同的位置,此时的p或q就是相交的结点位置。然后返回p或q,就算俩链表不相交,也没事,最终返回的大不了是null。,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。

2024-03-16 21:59:41 289

原创 17.搜索二维矩阵Ⅱ

编写一个高效的算法来搜索。思路:暴力解法,直接搜索。

2024-03-16 15:22:53 409

原创 16.旋转图像

旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。思路:先对角线两边互换,再中心线两侧互换。使用另一个矩阵来旋转图像。

2024-03-16 11:05:57 316

原创 15.螺旋矩阵

所以每次遍历完一条边界后,要把该边界先向内移动一个单位,同时判断是否超过了对面的边界,如果超过了,就break,退出循环。思路:定义上下左右四条边界,然后按上、右、下、左的顺序挨个遍历,每遍历完一条边界,就立即把该边界收缩一个单位。如图所示,上边界遍历完后(1、2、3、4),就要往下移动上边界,遍历完右边界,往左移动一个单位,再遍历下边界11、10、9。然后下边界往上移动一个单位,遍历左边界,此时只有5了。左边界往右移动一个单位,开始第二轮,遍历上边界6、7。然后再遍历右边界的元素8、12。

2024-03-15 17:28:16 361

原创 14.矩阵置零

思路:定义两个数组,一个m长度,一个n长度。然后遍历矩阵的每个元素,如果遇到0,就把两个数组对应行和列的位置标记一下。然后重新遍历矩阵,如果遍历到标记元素对应的行或列,就把元素置0.,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。

2024-03-15 11:22:09 314

原创 13.除自身以外数组的乘积

定义r和l俩数组,r[i]表示nums数组中第i个元素之前的所有数的乘积,l[i]表示第i个元素之后的所有数的乘积,然后再用一个for循环,把r和l的数组元素对应相乘,就是符合条件的数组。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。

2024-03-14 22:08:07 183

原创 12.轮转数组

思路:先把整个数组反转,再把前k个数反转,再把剩下的反转,就可以得到符合条件的数组。注意:有可能给的K是大于数组长度的,所以要用K对数组长度取余。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。

2024-03-14 17:27:38 437

原创 11.合并区间

本质:排序后,先定义第一个数组为startend数组,然后只要下一个数组与它重叠,那么就扩展或者保持不变startend数组,如果下一个数组不和它重叠(无法合并),那么就把它放进结果数组里,下一个数组就是新的startend数组。①如果该数组的左区间大于start,说明startend数组与该数组无重叠,那么把startend数组添加到ans数组中,然后把该数组(第i个数组)变成新的startend数组。②如果该数组的左区间小于等于start,说明欸还startend数组有重叠,就更新end,

2024-03-14 17:20:08 189

原创 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 138

原创 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 386

原创 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 163

原创 7.无重复字符的最长字串

2.在for循环中,如果r指针指向的元素在map中存在(说明字符串之前出现过该字符),并且同时满足l指针的位置小于等于之前字符的位置(即之前的字符在滑动窗口内),那么就让l指针移动到之前字符的下一个位置。本题使用双指针组成的滑动窗口以及哈希表的map(key表示字符,value表示在字符串中的下标)。l是左指针,r是右指针。在右指针指到重复元素的时候,并且滑动窗口里面还包含之前的重复元素,此时就要把左指针移到之前重复元素的下一个位置。此时,右指针指向a,发现map表里面有a,即发现了重复元素,但是。

2024-03-11 18:52:28 824

原创 6.三数之和

对b、c去重完后,此时left和right已经移动到了最后一个不重复的有效元素位置,下一个元素与该位置的元素是不相同的。去重就要求分别对a、b、c三个元素都要去重,因为三元组是元素的组合,假设遍历到a1时,满足条件的b、c有三组,a1的下一个位置a2的值等于a1,如果不对a去重的话,就会多出来三组重复的三元组。要注意,去重是要判断当前位置与前一位置(已经使用过)的元素是否相同,而不是判断当前位置与当前位置的下一个位置是否相同,因为下一位置有可能是符合条件的与当前位置相等的b元素,容易被错过。

2024-03-11 14:55:26 562

原创 5.盛最多水的容器

思路:该题的关键是假设已经找了两根线,如示例一所示,如果想找面积更大的线,只能使短的那根线往里靠。因为长的往里靠,如果是更长的,也没用,高度一直是短的一边,而且宽度还减小了,面积只能小于等于当前面积。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。然后计算面积,然后把短的线往里靠,继续更新面积即可。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。用双指针,起始分别指向两端。

2024-03-11 10:19:22 207

原创 4.移动零

快指针指向的元素如果不是零,就把该元素赋值给慢指针,快慢指针同时往后移动一个位置。思路:快慢指针,快指针遍历,把不是零的元素赋值给慢指针,是零的跳过去。快指针指向的元素如果是零,快指针往后移动一个位置,慢指针不动。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。快指针遍历完所有元素后,再补零就行。,编写一个函数将所有。

2024-03-10 21:58:37 192

原创 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 583

原创 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 315

原创 1.两数之和

本题呢,就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。如果没有符合条件的两个元素,就返回空数组,或者有多对符合条件的,只返回一对就可以。因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,

2024-03-10 11:13:26 161

原创 力扣22:反转字符串中的单词

①如果start的位置是空格,那么判断idx是否为0,如果不为零(说明idx当前指向的不是首个单词的开始位置,是其他单词的开始位置),就把idx的位置赋值为空格,idx移到下一个位置。因为idx是每个单词开始的位置,要求反转后的字符串中,第一个单词前面不能有空格,之后的每个单词前面都要有一个空格。④更新start ,让start指向原字符串中单词末尾位置,因为for循环的条件中,完成for循环的内容,还会让start++,所以下一轮for循环开始时,start在原字符串单词末尾位置的下一个位置了。

2024-03-08 15:27:02 232

原创 力扣21:替换字符串的数字

3.用双指针,指针j指向旧字符串的末尾,指针i指向当前字符串的末尾,如果指针j指向的元素是字符,那么就把nums[j]赋值给nums[i],然后两个指针同时往前移动一位。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。输出:打印一个新的字符串,其中每个数字字符都被替换为了number。样例输入:a1b2c3。

2024-03-07 15:22:42 404

原创 力扣20:反转字符串Ⅱ

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。1.每2k个字符中,反转前k个字符。剩余字符小于2k但是大于等于k,反转前k个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。输入: s = "abcdefg", k = 2。注意:其实此题目的三个要求可以分为两种情况。这两种情况其实在每一次分段中,是一种情况。输出: "bacdfeg"

2024-03-06 09:28:28 208

原创 力扣19:反转字符串(不能用库函数)

直接用C++里的一个库函数 reverse,调一下直接完事了, 相信每一门编程语言都有这样的库函数。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]

2024-03-05 20:44:47 133

原创 力扣18:三数之和

去重就要求分别对a、b、c三个元素都要去重,因为三元组是元素的组合,假设遍历到a1时,满足条件的b、c有三组,a1的下一个位置a2的值等于a1,如果不对a去重的话,就会多出来三组重复的三元组。同理,b、c也一样,所以。要注意,去重是要判断当前位置与前一位置(已经使用过)的元素是否相同,而不是判断当前位置与当前位置的下一个位置是否相同,因为下一位置有可能是符合条件的与当前位置相等的b元素,容易被错过。但是[-1,0,1]与[-1,0,1]或[0,-1,1]就是重复的,不可以。,比如[1,1,1]就可以。

2024-03-05 16:37:20 1645

原创 力扣17:赎金信

题目:给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。否则返回 false。2.magazine的元素(范围大的集合)来构建哈希表,然后遍历ransom,判断里面是否有和magazine相同的字符,如果有,就把哈希表中该元素的值(次数)减1,然后ransom的长度减1。意思就是用magazine的字符去组成ransom中的字符串,magazine可以剩,但是一个字母只能使用一次,

2024-03-03 21:07:43 313

原创 力扣16:四数相加

本题给的四个数组的元素不是连续的,并且元素个数和大小不确定,所以不能选数组,又因为需要记录元素出现的次数,元素和的值相同但是不是同一种排列组合也需要记录,不需要去重,所有不能用set,综上只能用map。本题目是把四个数组分成两大份,第一份是俩数组,进行遍历,计算元素之和以及出现的次数,记录在哈希表中,第二份的俩数组,计算元素和,并用target减去元素和,在第一份的哈希表中查找该值,并记录次数。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500。

2024-03-03 11:48:18 1517

原创 力扣15:两数之和(哈希表经典)

本题呢,就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。如果没有符合条件的两个元素,就返回空数组,或者有多对符合条件的,只返回一对就可以。因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,

2024-03-01 11:34:21 149 1

原创 力扣14:快乐数

2.注意题意,要么是1,要么无限循环,就这两种结果,如果是1,直接return true。如果是无限循环,说明sum值会重复出现,如果判断sum是重复出现的?那就是第一次在set里面添加了sum后,再判断set中是否有sum。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

2024-02-29 22:01:18 318 1

原创 力扣13:两个数组的交集(限制了数组长度及元素大小)

所以就可以 使用数组来做哈希表了, 因为数组都是 1000以内的。

2024-02-29 15:36:22 120 1

原创 力扣13:两个数组的交集(没限制数组长度及元素大小)

2.for循环中的-based for循环,可以在不需要索引的情况下,把目标容器的元素依次赋值给定义的变量,对定义好的哈希表进行遍历哈希表中的所有元素很方便。3.利用容器的find函数,来判断该容器中是否存在要查找的元素,如果存在返回该元素的迭代器,不存在返回容器.end()。unordered_set和vector一样也是一种容器,在定义的时候也是显示定义。那么就可以考虑用set来做,效率最高最常用的就是unordered_set。而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

2024-02-29 11:42:06 422 1

原创 力扣12:有效的字母异位词

需要定义一个多大的数组呢,定一个数组大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。示例 1: 输入: s = "anagram", t = "nagaram" 输出: true。,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。题意:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 2: 输入: s = "rat", t = "car" 输出: false。你可以假设字符串只包含小写字母。

2024-02-28 20:27:43 208

原创 力扣11:链表相交

while的循环条件就是当curA和curB指针不相等,并且curA指针不为空的时候,才能进入循环。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。,也就是结点的地址相同,是同一个结点,而不是因为结点的值相等就是相交结点。①AB指针不相等(相等就return了,找的就是指针相等的结点)如示例1所示,交点并不是1结点,而是8结点,相交结点是。注意:在最后的while中,也可以直接用如下代码。②并且后面有位置可以使其移动。

2024-02-27 22:08:09 487

原创 力扣10:删除链表的倒数第N个节点

此题的重点是双指针法,定义快慢指针,题目要求删除倒数第n个结点,那么先让快指针移动到第n个结点,然后再让快慢指针一起移动,直到快指针移动到NULL,此时慢指针就移动到了倒数第n个结点。又因为如果要删除一个结点,需要找到该结点的上一个结点,所以让快指针移动到第n个结点后,再往下移动一个结点,上述操作后,慢指针就会移动到被删除结点的上一个结点。核心思想是,假设有10个数,我想找到倒数第二个数,那么先单独移动两次(正向),然后再一起移动(10-2)次,也就是移动八次,找到倒数第二个也就是正数第八个。

2024-02-27 11:31:10 160

原创 力扣9:两两交换链表中的结点(物理层面)

可以看出,当要给某个结点的next赋值时,一定要提前把该结点的next用临时指针保存一下,不然被赋值后,原来的结点就被覆盖了,后面就找不到了。该题就用了两个临时指针保护每次循环中的第一个和第三个结点(假设每次循环中,按顺序是1、2、3结点(3结点可能是nullptr))。因为步骤一是要给cur->next赋值,所以提前保护交换前的cur->next结点(1结点),步骤二是要给cur->next->next(2号结点的next)赋值,所以提前保护交换前的2结点的next(3结点)。参考的代码随想录的思路。

2024-02-26 21:49:16 326 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除