7.2 顺序查找、折半查找·综合题讲评
约 40 分钟
7.2 综合题:找第一个不小于目标的位置
普通折半找到任一相等项即停;边界查找在相等时仍向左收缩。维护答案区间[l,r),若a[mid]<x令l=mid+1,否则r=mid,结束l即lower_bound。
手工推演
[1,2,2,2,5]查2:区间0..5,mid2值2令r2;mid1值2令r1;mid0值1令l1,返回1。查3返回4。
结构与代码
int lower(const vector<int>&a,int x){int l=0,r=a.size();while(l<r){int m=l+(r-l)/2;if(a[m]<x)l=m+1;else r=m;}return l;}
正确性
不变量:[0,l)均<x,[r,n)均>=x;每轮保持并缩短半开区间。
错解反馈
相等就返回导致不是最左;闭区间公式混入半开区间;返回n时仍访问a[n]。
迁移训练
[1,3,3,6]查0、3、7分别返回什么?答案0、1、4。
小纸条
[1,3,3,6]查0、3、7分别返回什么?
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。