写法1:在闭区间内查找,如果没有则返回-1。结束条件是l<=r。
示例:在下列数组中查找>=27的第一个数的下标(27的左边界)。
#include<bits/stdc++.h>
using namespace std;
int arr[9]={0,3,6,6,7,9,13,17,27};
int search(int x){
int l=1,r=8,m=0;
int ans=-1;
while(l<=r){
m=(l+r)/2;
if(arr[m]>=x) ans=m,r=m-1;
else l=m+1;
}
return ans;
}
int main(){
cout<<search(27);
return 0;
}
示例:在下列数组中查找<=6的最后一个数的下标(6的有边界)。
#include<bits/stdc++.h>
using namespace std;
int arr[9]={0,3,6,6,7,9,13,17,27};
int search(int x){
int l=1,r=8,m=0;
int ans=-1;
while(l<=r){
m=(l+r)/2;
if(arr[m]<=x) ans=m,l=m+1;
else r=m-1;
}
return ans;
}
int main(){
cout<<search(6);
return 0;
}
写法2:在开区间内查找,结束条件是l+1<r
借一下董晓老师的图:


被折叠的 条评论
为什么被折叠?



