- 博客(24)
- 收藏
- 关注
原创 关于指针和堆栈
new( )分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量;分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;new返回的是开辟的内存空间的首位地址,也就是说,new出来的对象必须要用指针来接受。new的空间是在堆上的,不像在栈上的对象自动管理生命周期,在堆上的空间必须使用delete或者delete[]来销毁。
2025-10-13 19:03:06
72
原创 关于快速排序
快排的实现有很多种,细节上看,可以有:Hoare法(找到后Swap)、挖坑法(上方代码的直接赋值)、双指针(待学习)。这个三数取中写的很优雅,可以记一记。选出最合适的Key值其实很简单:遍历数组找出中值,但是这样增加了O(n)的时间复杂度,对于长序列数组代价尤其高。快排的关键在于:给出的key值可以讲数据均匀地划分为两部分,最理想的情况是每次划分都是相等的两部分,此时时间复杂度为O(logn)。当给出的数据完全有序(降序或者升序),此时作为nKey的元素是最大/最小值,快排的时间复杂度退化到O(n^2)。
2025-10-13 17:02:42
131
原创 【LeetCode-349&350-两个数组的交集】
官方解:先对两个数组排序,然后用双指针分别指向两个数组的begin(),依次检测两个指针的值,谁小谁往前走,一样时:判断之前该数是否已经加入过nResultVec(这里的判断很巧妙,由于是升序数组,只需要用一个临时指针存储上一个加入nResultVec的元素,而不需要遍历整个nResultVec。)如果没有加入过,加入。直到任意一个指针超出vec索引,结束循环。
2025-09-27 15:15:22
197
原创 【LeetCode-234-回文链表】
最优解:先用快慢指针读到链表中间位置,再将后半部分链表反转,最后逐一比对。一共三种方法:递归、暴力解、最优解。
2025-09-23 14:22:14
206
原创 【LeetCode-141-环形链表】
左指针每次走一步,右指针每次走两步,循环判断左右指针是否相等,若相等,有环。注意边界条件:右指针->next和右指针->next->next都不能非空。
2025-09-19 18:24:06
185
原创 【LeetCode-125-验证回文串】
垃圾题,唯一的作用是让我知道有isalnum()这个函数,用来判断当前的char是不是字母和数字,是返回True。我自己的做法是先去除字符串中的非字母数字字符,再将字符串分成两半,前后指针分别进位/退位,逐一比对。
2025-09-19 18:21:55
131
原创 【LeetCode-28-找出字符串中第一个匹配项的下标】
在进行索引/解指针的操作前,不要让索引/指针的位置发生偏移。如果出现这种情况,修改边界条件。自己写的暴力解,以及学习的KMP算法(重点理解PMT数组和Next数组)。
2025-09-15 11:55:22
118
原创 [LeetCode-26-删除有序数组中的重复项】
值得注意的是:vector的.data()返回的是一个一般指针,取决于vector中数据类型。指针的偏移会根据类的数据大小自动计算偏移量。
2025-09-11 21:38:27
100
原创 【LeetCode-21-合并两个有序链表】
而且我一开始弄错了,题中给出的空链表是ListCode* L1 = Null,而不是ListCode* L1 = ListCode(),默认构造函数没有看清楚。(*l1).next 等价于 l1->next,->实际上是语法糖。*作声明是指针,做执行语句是解引用。
2025-09-09 12:17:35
110
原创 【LeetCode-14-最长公共前缀】
另外,无论是C++中的iterator.begin(),iterator.end()还是python中的切片操作,他们都是左闭右开的。多花时间想好边界条件,不要冲动下笔。
2025-09-08 11:02:35
123
原创 【LeetCode-13-罗马数字转整数】
玩了一下迭代器,对于STL中有索引访问的容器尽量不使用指针和迭代器,想炫技可以在连续容器中使用指针,或者在非连续容器中使用迭代器。
2025-09-07 15:55:24
126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人