二分
二分查找
前提:数据有序 and 连续空间
复杂度只有O(logn)
非常优秀的算法!
code
#incldue<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[10002],n,x;
int main(){
scanf("%lld%lld",&n,&x);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
ll l=1,r=n,ans=-1;
while(l<=r){
int mid=l+(r-l)/2;//防止溢出
if(a[mid]==x){
ans=mid;
break;
}
if(x<a[mid]) r=mid-1;
else l=mid+1;
}
printf("%lld",ans);
return 0;
}
易错点:
-
while循环条件:l<=r
-
变化:r=mid-1| l=mid+1
查找x第一次出现的位置
ll erfe1(ll x) {
l=1,r=n,ans=-1;
while(l<=r) {
mid=l+(r-l)/2;
if(a[mid]==x) {
ans=mid;
r=mid-1;//找到了,也要往前找
}else if(a[mid]>x){