感谢代码随想录
1. 数组
1.1. 滑动窗口
不断调整起始位置和终止位置,处理一块区间内的数据。
在本题中实现滑动窗口,主要确定如下三点:
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。确定好移动的情况,并处理需要优先移动窗口还是先处理窗口中的数据。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
1.2. 螺旋数组
确定边界处理的不变量,确保每个子问题的结构都是相同的
然后按照不变量写出每次循环的次数

1.3. 删除链表
删除列表时,最好增加dummy_head节点,删掉头节点更方便
1.4. 链表相交
- 求A,B的长度$l_A,l_B$
- 为方便起见,将A始终未较长链表,否则将A,B交换
- 根据$l_A,l_B$ 的差值,将长端链表对齐
- 依次比较
1.5. 环形链表
$$
slow = x+y \
fast = x+y+n(y+z) \
fast = 2slow
$$
计算得到
$$
x = (n-1)(y+z)+z
$$
代表,*从头节点走向环形入口 = 从相遇点出发走n个节点
// 先向前走再进行验证,否则第一个就相等了
1.6. 前缀和
将之间计算的结果累加保存在数据中,之后使用时使用结算完成的数组
需要更具题目要求,选择计算什么样的前缀数组
while (~scanf("%d%d", &a, &b))//按位取反,如果结果是eof=-1,取反之后结果为0
1.7. 哈希表
1.7.1. 数组作为哈希表
1.7.2. stl中的哈希表
此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构:
- std::set
- std::multiset
- std::unordered_set
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
1.8. 回溯算法
算法的模板
void backtracking(参数){
if(终止条件){
存放结果;
return;
}
for(选择:本层集合中的元素){
处理节点;
backtracking(路径, 选择列表); //递归
回溯,撤销处理结果;
}
}
vector
a a.push_back(int b) 压入数据, a.pop_back(), 弹出数据
还可以采用insert, + ,压入数据,使用erase(begin()+ i ,end())弹出数据
使用切割时候,需要注意下一次开始为本次切割后的下一次位置,此处回溯时候不需要还原,其余元素均需要还原。还原时候注意还原的位置。
1.8.1. 分割字符串方法
- 函数传递,参数
s + start + end
- 使用string 切割,
string s = s.substr(start, end)
1.8.2. 两阶vector初始化方法
is_palind_rome.resize(s.size(), vector<bool>(s.size(), false));