DAY 1
1.1排序算法
1.2排序的应用
1.3复杂度分析
1.1 排序算法
- 基于比较交换的排序算法
- 选择排序
- 思路:不断选择剩下数中最大的数
- 实现:一个序列,分为已排序区域和未排序区域;每次选择后更新(扩大)已排序区域,直至未排序区域长度为0
- 代码:
- 冒泡排序
- 思路:逐个进行比较交换
- 很明显效率比较低
- 插入排序
- 思路:模拟摸扑克牌的过程?和选择排序的维护序列是差不多的(都是一个序列分为已排序区域和未排序区域)
- 希尔排序
- 选择排序
1.2.排序的应用
-预处理
-多关键字排序
-离散化
1.3复杂度分析
- 阶的比较
- 排序算法复杂度
- 选择排序
- 冒泡排序
- 插入排序
- 桶排序
- 归并排序
- 快速排序
- 堆排序
- 选择排序
- 复杂度分析技巧
DAY 2
模测模测
1.归并排序求逆序对
2.电线杆上的小广告
3.逛画展
4.生日礼物
DAY 3
1.1队列
1.2广度优先搜索
1.3循环队列
1.4双向队列
1.5单调栈
1.6单调队列
1.1队列
1.1.1 手写队列
1.1.2 循环队列
- 只可以存储size-1个元素
- 通过取模实现
1.2广度优先搜索
1.2.1dfs与bfs
dfs:“能达到的都是兄弟”
bfs:“能达到的都是我儿子”(雾)
1.2.2为什么我们不能用dp的三种基本方法做dfs
/ 如何用bfs实现dp的思想
dp与dfs
1.3循环队列
为什么要使用循环队列
实现
1.4双向队列(双端队列)
luogu签到该死的准
果然啥都没听懂==
1.5单调栈
-
- 应用1:询问区间最值
○应用2:找到左右两侧第一个比自己小的位置
■例题:poj2559
比栈顶元素更符合单调栈单调性的代替 原来的栈顶元素
1.6单调队列
-
- 应用1:解决特殊的区间最值问题(**区间的单调性)
- 这就不需要二分啦
- 应用1:解决特殊的区间最值问题(**区间的单调性)
○应用2:滑动窗口(求满足条件的最短区间)
stl队列不方便调试,只用一个栈、队列或者单调队列时最好用手写
DAY 4
1.1二分
1.2倍增
1.3链上分治
1.1.二分
【题】二分求某个数的下标
【题】单峰数组(肯定是前段上升后段下降,不然没法做)→三分
序列二分的应用:求和问题
1.二分的思路:先找到大于等于aj的第一个数,再二分找不等于aj的第一个数,两个坐标差就是
2.单调栈/单调队列
如图 (两边走指针)
序列二分一般有两种方法:
1.二分 :对数据排序, 对每个询问二分(可以处理在线询问,复杂度更大)
2.走指针:对数据和询问排序,一次扫描解决所有问题(只能离线询问,复杂度更小)
二分答案:关键词:“最大值最小”