整数二分查找
高效查找有序数组中某数字的位置,时间复杂度为O(logn),需注意边界问题。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int n,q;
int num[N];
//查找左端点
int check(int k)
{
int l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(num[mid]>=k) r=mid;
else l=mid+1;
}
}
//查找右端点
int search(int k)
{
int l=0,r=n-1;
while(l<r)
{
int mid=l+r+1>>1;
if(num[mid]<=k) l=mid;
else r=mid-1;
}
}
int main()
{
cin>>n>>q;
for(int i=0;i<n;i++) cin>>num[i];
while(q--)
{
int k;
cin>>k;
int i=check(k);
int j=search(k);
if(num[i]==k) cout<<i<<" "<<j<<endl;
else cout<<-1<<" "<<-1<<endl;
}
return 0;
}
小数二分查找
小数二分查找基本不需要注意边界问题,套模板即可。
给定一个浮点数 n ,求它的三次方根,结果保留 6 位小数。
#include<iostream>
#include<cstdio>
using namespace std;
double n;
double find(double x)
{
double l=-1e4,r=1e4;
while(l<r)
{
double mid=(l+r)/2;
if(mid-l<1e-7) return mid;
if(mid*mid*mid<=n) l=mid;
else r=mid;
}
}
int main()
{
cin>>n;
printf("%.6f",find(n));
return 0;
}