DAY01
时间复杂度
概念:可用来衡量程序或算法执行效率或速度
时间频度
一个算法中的语句执行次数成为语句频度或时间频度,记为 T(n)T(n)T(n),在代码中我们通常会计算每一行语句的执行次数相加得到 T(n)T(n)T(n)。
大 O 表示法
最坏时间复杂度
时间复杂度越高,效率越慢。
C++ 程序 111 秒执行次数在 10810^8108 左右。
简化规则:
1. O(1)O(1)O(1) 代表所有常数时间复杂度
比如:T(999)→O(1)T(999) \rightarrow O(1)T(999)→O(1)
2. 修改后的时间频度函数 T(n)T(n)T(n) ,只保留最高阶
比如:T(3+N+N2)→O(N2)T(3 + N + N^2) \rightarrow O(N^2)T(3+N+N2)→O(N2)
3. 若最高阶系数存在且不是 111,则删去该常数
比如:T(23N)→O(N)T(\frac{2}{3}N) \rightarrow O(N)T(32 N)→O(N) T(100N)→O(N)T(100N) \rightarrow O(N)T(100N)→O(N)
> O(1)O(1)O(1) 常数阶 O(N)O(N)O(N) 线性阶 O(N2)O(N^2)O(N2) 平方阶 O(logN)O(logN)O(logN) 对数阶
数学
ab=ca^b = cab=c 可以知道 logac=blog_a{c} = bloga c=b,读作 logloglog 以 aaa 为底 ccc 的对数等于 bbb。
枚举算法
枚举算法是一种将问题的所有可能结果一一列举,并用条件检验是否成立的解题思维。
1. 枚举数字
2. 枚举数组元素(数字 变成 对应下标)
枚举思路:
1. 确定枚举对象有几个,对应 for 循环嵌套个数。
2. 确定每个枚举对象的范围。
3. 编写判断条件(易错点在优化后会忘记调整)。
4. 如果枚举出现 TLE 了,那么我们需要进行优化,优化后一定要去确保计算出来的值在范围内。
模拟算法
问题怎么描述,程序步骤就怎么设计。
额外知识点
平方数判断
约数个数
DAY03
二分查找步骤
1. 确定查找范围,L≤答案≤RL \le 答案 \le RL≤答案≤R
2. 范围存在,L≤RL \le RL≤R
eg: L=5,R=4L = 5, R =4L=5,R=4 ,找不到任何一个元素既大于等于 5 又小于等于 4。
3. 只要范围存在,找中间的一个元素,int mid = (left + right) / 2;
常用版本:(left + right) / 2
防止越界版本:(right - left) / 2 + left
4. 分成三部分,根据比较结果去修改对应范围:
1. 更小数:L 到 mid-1
2. 自己:mid
3. 更大数:mid+1 到 R
大于等于 X 的第一个数下标
第一个大于 X 的第一个数下标
元素出现个数 = upper_bound - lower_bound