跳到正文

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

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。