六、二分答案
1.二分题目的题目特征:
当问题的答案具有某种单调性时,我们就可以二分答案。单调性可以理解为随着x的增加,对应y值逐渐增大——单调递增;随着x的减小,对应y值逐渐减小——单调递减。
2.二分查找的模板:
bool check(int mid){
验证mid是否合理
}
int main(){
输入数据并排序处理
二分模板:
int l=(),r=(),mid; 定义左右边界
while(l<r){
根据check(mid)缩小左右边界
}
cout<<l; //或者cout<<r;
}
七、搜索
1.深度优先搜索算法(DFS)
DFS的主要思路是从图中一个未访问的顶点V开始沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。
DFS的一般框架
DFS一般使用递归去实现
void dfs(type n){//当前搜索的是第几个节点
if(符合条件) cout<<答案;return;//递归的出口
for(//选择该阶段的可以访问的所有节点){
标记访问该点
dfs(n+1);//进入下一阶段,往下递归
还原访问现场
}
}
2.广度优先搜索(BFS)
BFS的主要思路是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻接点的相邻接点.
BFS的一般框架
void bfs(起始状态){
queue<int>q;//创建队列
q.push(起始状态入队);
起始状态标记
while(q.size()){当队列非空
获取从起始状态可以到达的下一个点
if(这个点可以走)
q.push();
......
处理(队首)q.top();
相应操作
q.pop();队首弹出队
}一次循环结束,执行下一次循环
}