自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录八股训练营一刷总结心得

这40天里主要是锻炼了我的意志力和执行力,虽然很多八股背了又忘,但是这40天总算是坚持下来了,加油加油!

2025-04-02 23:00:14 103

原创 力扣HOT100之链表:141. 环形链表

这道题都已经刷烂了,没啥好说的,就是定义快慢指针,慢指针每次移动一步,快指针每次移动两步,如果链表中有环,那么快指针一定会追上慢指针,追上时直接返回。,否则快指针会直接到达链表的末端,此时直接返回。

2025-04-01 21:33:04 206

原创 力扣HOT100之链表:234. 回文链表

想法是美好的,但是我兴冲冲写完提交以后报错了,原因是我调用反转链表函数以后,对原链表的结构也进行了修改,这就导致无法正常比较,然后得到了错误的结果,后面我还是用最笨的办法AC的,就是用一个vector存储链表中的所有值,然后再将其复制到一个新的vector,再将新的vector反转,最后再与原vector逐元素比较,但凡出现不同的元素就直接返回false,否则返回true,但是这样做的时间复杂度和空间复杂度都太高了,无语(ˉ▽ˉ;是否为空,若为空,说明比较结束,否则就还没结束。,所以我们只需要判断。

2025-04-01 21:22:01 335

原创 力扣HOT100之链表:206. 反转链表

双指针,顾名思义,就是用两个指针来保存一些必要的变量,对于一段链表,我们要将其反转,我们必须知道这段链表的前置节点,当前遍历到的节点和当前节点的下一节点,我们分别用。这道题今天已经是第三次刷了,思路都知道但是代码就是写不对,我真的要红温了🤯🤯。从上面到下面经历了一次反转,可以看到,在一次反转中,我们仅将。的位置整体后移一位,然后周而复始,我们通过一个。节点也是反转后的链表的首元素,因此我们直接返回。以后这道题就统一用双指针法来做吧。循环来实现这样的处理流程,直到。指向原链表的最后一个元素,此时。

2025-04-01 19:54:39 225

原创 力扣HOT100之链表:160. 相交链表

返回即可,如果两条链表相交,那么返回的就是他们真正的交点,如果两个链表没有相交,返回的就是空指针,所以代码写出来特别简洁。上面是两个链表相交的情况,下面是两条链表不相交(可以认为是广义的相交,因为两个链表的末尾都指向空节点)的情况,这道题已经刷过三四回了,看到这道题就直接秒了,纯数学技巧,我们直接用两个指针变量分别保存。的遍历路径用红色数字表示,可以看出,在上面的例子中,总共经过了10步,在下面的例子中,总共经过了9步,链表的首元素地址,继续遍历,同理,当遍历到。链表的首元素地址,并继续遍历,当。

2025-04-01 19:04:23 263

原创 力扣HOT100之矩阵:240. 搜索二维矩阵 II

的题解,感觉两位大佬的思路都很相近,只不过一个从矩阵的右上角开始比较,一个从矩阵的左下角开始比较,这里我就主要讲一下Krahets的思路,还挺通俗易懂的。这道题直接暴力AC的,虽然也能过,但是耗时太长了,AC之后看了下灵神和Krahets。我们直接找到矩阵最左下角的元素,假设为。列可以直接舍弃,因为第。列可以直接舍弃,因为第。时终止搜寻,直接返回。

2025-03-31 22:23:37 244

原创 力扣HOT100之矩阵:48. 旋转图像

这道题本来想用剥洋葱的办法的,一直写不对,放弃了。直接去看题解,用剥洋葱其实也可以做,就是要从外层处理到内层,每一个边界上的元素为matrix[0].size() - 1个,这样一来,四条边界上的元素个数都相同,然后直接狂用swap函数交换就完事了,但是我看评论区还有更加简洁的办法,就是通过找规律可以看出来,,我想了一下,剥洋葱还是有点太麻烦了,然后就直接用这个简单的思路,代码也很好写。

2025-03-31 20:55:52 300

原创 力扣HOT100之矩阵:54. 螺旋矩阵

他的思路比较朴素,就是按照。的顺序遍历矩阵,然后将遍历到的元素添加到数组中,但是这个思路中是遍历一条边后就立刻更新对应的边界,例如,刚刚把上边界的所有元素添加到数组后,就立刻将上边界+1,然后遍历右边的边时,右边是直接从更新后的上边界为起点开始遍历的(这就意味着在同一圈中,上边界添加的元素一定比下边界添加的多,右边界添加的元素一定比左边界添加的多),另外,只要当前的下标值。),如果出现了这样的情况,就说明已经打印完了所有元素,无需再继续遍历,直接退出当前的循环。在退出循环之后,直接返回数组即可。

2025-03-31 19:17:14 441

原创 力扣HOT100之矩阵:73. 矩阵置零

置为0,经过一次遍历后,除了第0行和第0列的情况没有统计出来,其余的行和列都已经遍历结束并且打上标签,由于打标签会向第0行和第0列添加0,打完标签后无法判断其本身原本就包含0,因此在遍历矩阵打标签之前,我们需要遍历矩阵的第0行和第0列,如果他们本身就有0,我们就分别用两个变量记录下来,至此,我们先分别遍历了矩阵的第0行和第0列,再遍历了矩阵的其余行和列,这就遍历了一次矩阵,我们再遍历一次矩阵,从下标为1的行和列开始,对于matrix[i][j],如果。我们可以将第0行和第0列作为记录的标志位,例如。

2025-03-30 19:29:45 260

原创 力扣HOT100之普通数组:41. 缺失的第一个正数

这道题自己想了一会没想出来,然后就去看题解了,感觉要满足O(n)的时间复杂度,还要满足O(1)的空间复杂度还蛮难的,这里主要把题解的思路讲一下,很巧妙。,因此我们只需要从左往右再遍历一次数组,检查数组的元素是否与其下标对应,如果发现某个位置上的元素。循环,在数组内存在对应的正确元素时(不存在的话就无能为力了),我们一定能保证下标为。的情况,我们不作任何处理,因为再怎么处理也没用,此外,若下标为。匹配上,我们是不知道的,然而我们在前面提到,每进行一次。处放置的元素是正确的,但是交换过来的值是否能与下标。

2025-03-28 21:28:49 426

原创 力扣HOT100之普通数组:238. 除自身以外数组的乘积

看了下灵神的题解,他的思路和我一样,也是用前后缀来做的,这里就不再赘述了。这道题不能使用除法,我第一时间想到用前缀表和后缀表来解决,假设数组。,一共需要三次线性遍历,时间复杂度为O(n)。,其中特别要注意的是,前缀表。,我们直接定义前缀表。

2025-03-27 19:46:21 168

原创 力扣HOT100之普通数组:189. 轮转数组

看了下灵神的题解,感觉他的思路比较有泛化性,三次反转的思路可以应用在轮转的问题上,主要是看下三次反转为什么可以实现轮转的效果,这里直接看灵神的证明就好了,我觉得还蛮通俗易懂的。这道题我也没想到特别好的解法,直接用最笨的解法AC了,首先k可能会远超数组。灵神也提到了剪枝的问题,为了避免无效的轮转,我们需要先对k取模再进行反转。的大小,这就意味着可能会出现多次无效轮转,因此我们先对次数k进行剪枝,循环从后往前遍历,将当前位置的前面k个位置上的元素移动过来即可,当下标。就会被轮转到数组的前端,则。

2025-03-27 17:05:21 175

原创 力扣HOT100之普通数组:56. 合并区间

用贪心算法需要先将整个二维数组进行排序,排序规则就是向量的左侧端点小的排在前面,然后我们定义好排序规则后利用。这里还有一个要注意的点,当遍历结束后,还有最后一个区间没有加入到结果中,所以在循环结束后我们需要手动将。看了下灵神的题解,思路也是贪心,但是他的代码简洁很多,这里也把他的代码贴出来学习一下。函数对输入数组进行排序,然后遍历整个向量,在初始时,定义第一个向量的左右端点分别为。的区间,就将该区间加入到前一个区间,此时我们需要维护。的值,如果当前遍历到的向量的右端点值。,然后每遍历到一个左端点小于。

2025-03-27 16:15:48 204

原创 力扣HOT100之普通数组:53. 最大子数组和

但是我看灵神解这道题是用前缀和和动态规划来解的,这里主要学习一下前缀和的解法,动态规划的解法在代码随想录里已经学习过了。这道题目我用贪心做的,感觉用贪心的思路比较简单,以后要是面试碰到这道题就直接用贪心好了,这道题用贪心的核心思想就是不断将数组元素。来记录当前的最小前缀,每遍历一个前缀和,我们就可以将其减去其左侧的最小前缀和,这样就能得到以第。开始遍历,直到遍历结束,在从左往右遍历的过程中,用一个变量。,我们知道子数组的和可以转化为两个前缀和的差,例如,这是贪心的代码,还是挺简洁的。

2025-03-26 23:21:46 292

原创 力扣HOT100之子串:76. 最小覆盖子串

有点像,然后就依葫芦画瓢写了一部分,但是还是没有想到额外定义一个左右指针来维护最短子串的左右端点的下标,这里把这个思路具体说下。中对应的字符个数),如果涵盖了,就说明当前滑动窗口已经找到了符合要求的子串,如果该子串的长度(循环结束后,我们需要判断s是否真的满足涵盖条件,如果自始至终都不满足,那么。分别代表最终的最短子串的起点下标和终点下标,在初始状态下,令。,就一直循环记录结果,当不再涵盖时,再进行下一次。,此时直接返回空字符串即可,否则就返回s字符串中。中的字符,然后我们先将右指针指向的字符计入。

2025-03-26 17:04:57 447

原创 力扣HOT100之子串:239. 滑动窗口最大值

感觉自己当时写的逻辑比较通俗易懂,这一次我看的灵神的题解,也是用单调队列做出来的,但是不像上一次定义了那么多函数,但是感觉不如上一次的思路好懂。窗口长度有限,在经历上一步之后,队列中的元素个数可能超出窗口大小,所以需要对队列中的元素个数进行判断,由于加入的是第i个元素,因此我们直接判断。时才会触发这个结果,由于队首元素就是队列内的最大值,因此我们直接将队首中存储的下标对应的元素存入结果向量即可。二是判断队尾元素是否。右端元素,若满足,则需要不断将队尾元素弹出,直到队尾元素。若满足,则需要将队首元素弹出。

2025-03-25 19:20:57 388

原创 力扣HOT100之子串:560. 和为 K 的子数组

然后再来看题意,题目要求和为k的连续子数组的个数,我们只需要找到这样一对。加入到哈希表中,顺序不能颠倒,否则可能会出现自己被加到结果中(k = 0)的情况。的个数即可(必须是左侧的,不包含自己),然后将对应的结果累加到result中,这道题依然是不会啊,去看了灵神的题解才做出来的,这里讲一下详细的思路。的个数我们用哈希表来统计。为了降低运算的次数和时间复杂度,我们需要定义一个数组。的个数累加到result中,再将当前遍历到的。即可,然后我们再将符合条件的。的所有元素之和,其中,数组的时候,只需要统计。

2025-03-25 10:56:14 143

原创 HJ C++11 Day7

array实际上就是包装好的数组,里面提供一些基本的接口,但是没有构造函数和析构函数(因为数组没有构造和析构函数),会在编译时创建一个固定大小的数组,std::array 不能够被隐式的转换成指针,使用 std::array只需指定其类型和大小即可。

2025-03-24 10:43:23 227

原创 力扣HOT100之滑动窗口:438. 找到字符串中所有字母异位词

当两个哈希表不相等时,则说明当前滑动窗口框住的不是异位词,需要直接将滑动窗口右移,所以我们需要及时将窗口左端的元素移除,在下个循环中,滑动窗口右端会新增一个元素,这样就维持了滑动窗口的长度不变。作为哈希表的数据结构,注意,当删除窗口左端的元素时,如果窗口左端的元素计数已经降为0,则将对应的键删除,若不及时删除的话,该键依然会存在于哈希表中,但是滑动窗口内已经没有这个字符了,这就会影响两个哈希表之间的相等判断,即使后面的滑动窗口已经框住了异位词,但由于其他字符的键没有删干净,而导致二者不相等,从而漏掉答案。

2025-03-23 18:04:57 339

原创 力扣HOT100之滑动窗口:3. 无重复字符的最长子串

类型,然后我们需要定义左右指针,分别指向窗口的左端元素和右端元素,在初始状态下,左指针和右指针指向同一个元素(字符串s的第一个字符),然后使用一个for循环来移动右指针,只要右指针指向的字符在子串中的个数。循环来将左指针右移,并同时将左指针指向的字符数量-1,当左指针遍历到重复字符时,先将该字符的数量-1,再将左指针右移一位,此时子串中不再包含重复字符,退出。,就不断将右指针右移,并且更新最长无重复子串的长度,如果遇到right指针指向的字符在子串中的数量。,则说明已经出现了重复字符,则通过一个。

2025-03-23 16:19:49 170

原创 HJ C++11 Day6

在这里,右值引用更像是“偷取”,我们没有深度拷贝堆内存中的数据,而是仅仅复制了指针,并把源对象 other 的指针置空。事实上,我们“偷取”了属于源对象 other 的内存数据。由于源对象 other 是一个右值,不会再被使用,因此客户并不会觉察到源对象被改变了。该语义的发展是为了非必要的赋值操作。这里感觉只听懂了一点点,这里直接放。

2025-03-23 16:01:28 224

原创 HJ C++11 Day5

Lambda本身是一个函数对象,完整的语法形式为其中的中括号为introducer小括号用于接受输入参数用于指定函数中括号里的数据能不能被改写用于指定函数能不能抛出异常用于描述lambda的返回类型以上三个关键字都是可有可无的,但是只要出现了其中一个,那么小括号就一定要写,如果三个都没有,那么小括号也可以不写。对于这一段代码对于这一段代码对于这一段代码感觉Lambda表达式的语法和用法太高深了,一时半会只能想到这么多了,其他的补充内容看看。

2025-03-23 14:10:46 270

原创 力扣HOT100之双指针:42. 接雨水

这道题在之前刷代码随想录的时候做过,果然现在又不记得了,当时是用单调栈做的,现在忘得一干二净,难绷。。。单调栈的思路不是本文的重点,单调栈的思路可以参考我的这道题我用双指针想不出来,然后去看灵神的题解了,学到了一种用前后缀解决的新办法,有必要记录一下。

2025-03-12 22:11:53 314

原创 力扣HOT100之双指针:15. 三数之和

这道题一开始看只想到了从左往右遍历,然后再分别定义左右指针指向遍历到的元素右边的区间的首元素和尾元素,然后再不断移动左右指针来收集元素,这样的想法最大的问题在于无法处理重复元素的问题,外层的遍历循环无法去重,所有指针移动的过程中也不能去重,所以直接按照这个想法来是行不通的,我在刷代码随想录的时候也刷过这道题,看了下当时自己写的博客,马上就懂了。言归正传,当收获结果后,左右指针必须向中间移动,直到左右指针指向的值都和收获结果时他们各自指向的值不同才停止。

2025-03-11 21:30:15 185

原创 力扣HOT100之双指针:11. 盛最多水的容器

然后两根指针不断向中间移动,用一个result变量来维护最大水量,问题来了,这两根指针向中间移动应当遵循什么规则呢?我们要知道,两根柱子之间的水量取决于较短的那个柱子,指针向中间移动的时候,水池的底部是不断变窄的,只有将最短的那根柱子拔高,才有可能增加蓄水量,尽管移动指向较短柱子的指针,可能新的柱子会更短,但是没有别的办法,不移动较短柱子一定不可能得到更大的蓄水量,所以我们需要判断左右指针指向的柱子中哪个较短,哪个较短就将哪个柱子向中间移动。看了下灵茶山大佬的题解,思路和我是一样的啊,怎么我的代码这么慢?

2025-03-11 20:25:00 280

原创 力扣HOT100之双指针:283. 移动零

后来看了下灵茶山大佬的题解,感觉思路确实清奇,这里讲一下,对于一个存有0和非0元素的数组,我们需要不断将非0元素往前搬,0元素放到后面,那么我们需要维护一个区间,这个区间内的所有元素都是0,且区间左边的元素都是非0的,那么我从这个区间的右边一个元素开始向后遍历,每当遇到一个非0值,就将该非0值移动到区间的最左侧,原来非0值的位置变为0,就相当于把0看作是空位,当非0值移动到数组最左边的空位(区间左数第一个0)时,原来的位置就会空出来,自然要赋值为0。

2025-03-11 19:50:31 189

原创 HJ C++11 Day4

感觉看这一部分看的有点云里雾里的,写笔记也不知道该怎么写,这里先放其他人的笔记吧,日后有什么心得再在这里加上。

2025-03-11 15:30:13 681

原创 HJ C++11 Day3

该代码表示将vec中的每一个元素都遍历一次并依次赋值给i。下面来深刻理解一下这个语句等价于什么。对于就等价于或者。

2025-03-11 09:52:52 359

原创 力扣HOT100之哈希:128. 最长连续序列

这道题我想的比较简单,先遍历一遍输入的数组,然后将读取到的数字存入一个map容器中(注意,不是unordered_map),数字作为键,布尔变量为值,然后再遍历一遍map,用一个变量temp记录上次循环读取到的值,temp_result用来记录当前遍历到的子序列的长度,一旦遇到当前遍历到的值与上一次遍历到的值不连续的情况,立马将temp_result置为1,然后继续向后遍历,在每次循环中,最终返回的值result与temp_result比较大小,将较大值作为result的新值。这道题还是有难度的。

2025-03-08 21:13:57 331

原创 HJ C++11 Day2

对于一个类P当运行讨论:如果只有第一种构造函数时,p不受影响,q也不受影响,因为这一包数据会被拆解为2个数据,恰好符合构造函数的参数要求,但是r会被拆解为3个参数,不符合构造函数的要求,s也不影响。的背后是一个array,但是实际上array是一个迭代器。编译器在看到大括号{}时就会自动调用的私有构造函数,按理说应该没有人能够调用它的私有构造函数,但是编译器具有最高权限,编译器可以调用。实际过程是:编译器在看到大括号{}后,在调用私有构造函数之前,就已经准备好了一个array,然后把这个array。

2025-03-05 23:12:26 401

原创 力扣HOT100之哈希:1. 两数之和

因为当第一次遍历到这个数时,哈希表中还没有存储该数,所以第一次遍历到它时会直接将其添加到哈希表中,当第二次遍历到大小相同的值时,由于哈希表中存储的是上一个相同值的下标,一定不可能是当前元素的下标,所以这种情况无需考虑。是否在哈希表中,如果在,直接返回哈希表中对应键的值和当前遍历到的元素下标,如果不在,就直接将{nums[i], i}作为键值对添加到哈希表中。来建立哈希表,其中键用来保存向量中的元素,而对应的值则为元素的下标。遍历整个向量,当遍历到nums[i]时,立马检查。

2025-03-04 22:31:36 257

原创 力扣HOT100之哈希:49. 字母异位词分组

字符串中每个字符的出现次数的向量作为unordered_map的键,遍历向量中的每一个字符串s,用一个字符串key接收这个值,然后将其排序,则ASCII码小的字符会在前面,大的在后。这道题自己先想了一边,定义了一个比较字符串的函数,用二重循环和一个数组来实现字符串的比较,若两个字符串是异位词,那么就返回true,否则返回false,在主函数中,同样用一个二重循环来遍历向量中的每一个字符串,看它是否在之前出现过异位词,若没有,则新建一个列表存放,若有,则将其放到异位词所在的向量中。

2025-03-04 21:22:56 239

原创 HJ C++11 Day1

感觉引入了可变参数模板的最大好处是方便递归调用,将参数包不断分解为1+n的形式。...表示任意个数,任意类型。

2025-03-04 16:07:30 437

原创 终章——代码随想录算法训练营一刷总结

在这中间被力扣上的题难倒多少回我已经记不清了,好不容易把当天的题刷完,还得写打卡博客,写博客写到凌晨一两点也不记得有多少回了,坦白讲,在这两个月中,我每天至少要挤出3-4个小时来刷题,写博客,这两个月写的博客比我过去4年都要多,我被迫从一个年更博主变成日更博主,想想还真有点搞笑,哈哈哈哈哈。两个月很长,长到我都记不清楚自己因为力扣上恶心人的测试样例和自己写出的bug红温了多少回,两个月也很短,短到我这样一个三分钟热度的人也能侥幸坚持下来,也能在通关以后大喊一声“拿下!

2024-10-18 20:49:04 409

原创 代码随想录打卡Day66

今天是代码随想录训练营的最后一天!!!!终于坚持下来了!!!太激动了!!!!已经开始期待开营前说的奖励是啥了啊哈哈哈哈😄今天一共有两道题,第一道就是动态规划的思想,看完以后代码就写出来了。第二道还是比较困难的,我看了很久才慢慢领略其中的思想和精髓,第二道题的代码主要还是参考代码随想录的题解代码,但是加了很多自己的注释。

2024-10-18 12:05:03 321

原创 代码随想录打卡Day65

今天是训练营倒数第二天,冲冲冲!!!!第一道题还稍微难理解一点,看了一段时间才彻底看懂,第二题思路还比较简单,稍微看了下思路就自己AC了,第三题属于是思路简单,看了下思路大部分代码都能写出来,但是里面有坑的,想那么快AC也没那么简单。

2024-10-17 16:43:27 896

原创 代码随想录打卡Day64

今天的两道题都看题解了,感觉用堆来优化dijkstra算法的方式还是有点不熟悉,即使是看懂了原理,自己上手写代码的时候也感觉也不出来,第二道关于Bellman_ford算法的题从原理上来说不难理解,完全看懂这个算法的流程以后感觉代码也没有很难写。

2024-10-16 19:30:41 474

原创 代码随想录打卡Day63

今天学拓扑排序,和dijkstra算法,拓扑排序的思路第一次见,dijkstra算法的题目看起来和昨天写的prim算法很像,但是还是有细微的区别。感觉两个题目看完题解以后也没有那么难实现。

2024-10-15 19:45:13 395

原创 代码随想录打卡Day62

今天就一道题,两种方法来做,总的来说第一种方法更难些,光看懂思路还是要看题解代码才能AC,有了之前并查集的基础,第二种方法稍微看了下思路就可以自己写出来了。

2024-10-14 18:51:29 299

原创 代码随想录打卡Day60

今天一共两道题,第一道题还行,稍微看了下思路就自己AC了,第二道题属实被恶心到了,思路很难想,就算想到了思路,代码实现也挺困难的。

2024-10-12 23:20:22 608

空空如也

空空如也

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

TA关注的人

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