一、解题技巧
(1)时间复杂度、空间复杂度估计
(2)滑动窗口法 定长问题 通过滑动窗口更新答案
(3)双指针法 不定长问题 从头尾分别遍历更新,并不一定是真的用指针
(4)记忆数组 记忆数组+递归 ≈ 递推 用时间换空间
(5)方向数组 防止越界 1. 判断边界
2. 填充零
二、大整数/高精度问题
(1)数字存储方式 1. 倒着存
2. 用数组存
3. 数组第一位存储数字长度
(2)计算方法 按位计算,然后进位
(3)大整数除法 要维护 待除数
三、网格路径,数塔问题
递推问题 从上到下求解,从下到上求解
四、二分问题
sort容器、朴素二分查找、二分查找特殊情况、二分答案、二分答案小数情况
二分答案的本质就是用函数代替了数组
1) 00001111情况
while(L != R){
mid = (L + R) / 2;
L = mid + 1;
R = mid;
}
2) 11110000情况
while(L != R){
mid = (L + R + 1);
L = mid;
R = mid - 1;
}
3)二分答案要素
1. “答案”是什么 通过答案可以计算什么
2. 答案的上下区间是什么
3. 是哪种特殊情况
五、STL容器的使用
string、vector、stack、queue、deque、priority_queue、list、
set集合(红黑树实现)、map映射(红黑树实现)、unordered_set/map(哈希表实现)、
unordered_multiset/map
1)vector 扩容方法取决于编译器 2倍或者1.5倍
2)deque内部实现 维护指针表,连续空间维护地址域,在外部开辟数据域,二次访问。
3)set的插入删除查找都是时间复杂度都是对数级,而unordered_set 插入查找都是常数级
六、经典题型
模拟、贪心、枚举
1) 编码能力就是把思路实现成代码的能力。
2)枚举题的难点是确定循环的范围
3)前缀和数组 快速求区间和
几天不刷题,啥都不会了o.o