C++刷题笔记(代码随想录)
数组
1、二分法
二分法的条件:
- 数组为有序数组;
- 同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的
两种写法:
-
定义target在
[left, right]
区间while (left <= right)
要使用<=
,因为left == right
是有意义的,所以使用<=
if (nums[middle] > target)
right 要赋值为middle - 1
,因为当前这个nums[middle]
一定不是target
,那么接下来要查找的左区间结束下标位置就是middle - 1
-
target 是在一个在左闭右开的区间里,也就是
[left, right)
while (left < right)
,这里使用<
,因为left == right
在区间[left, right)
是没有意义的if (nums[middle] > target)
right
更新为middle
,因为当前nums[middle]
不等于target
,去左区间继续寻找,而寻找区间是左闭右开区间,所以right
更新为middle
,即:下一个查询区间不会去比较nums[middle]
求中值的小track
int middle = left + ((right - left) >> 1); // 防止溢出
求关于平方根的数
将边界设置为target/2
,因为
t
a
r
g
e
t
<
=
t
a
r
g
e
t
/
2
\sqrt{target} <= target/2
target<=target/2,但是注意要单独判断target=1
的情况。
2、移除元素
快慢指针
根据快慢指针的相对位置来减少赋值条件:26. 删除有序数组中的重复项
如果不影响后面的数据可以试试倒序遍历:844. 比较含退格的字符串
3、长度最小的子数组
滑动窗口:窗口内可以用unordered_map
来记录
主要确定如下三点:
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
链表
1、移除链表元素
- 直接使用原来的链表来进行删除操作。
- 设置一个虚拟头结点在进行删除操作。
2、反转链表
- 双指针
3、删除链表的倒数第N个节点
- 双指针
- 考虑移动多少问题,主要涉及到代码中用
node->next != nullptr
还是ndoe != nullptr
4、链表相交
- 利用两个链表的差值
- 判断用
node->next != nullptr
还是ndoe != nullptr
,考虑到输入为[]
的情况