二分查找(四种常用模板)
二分查找
1.复杂度
时间复杂度:O(logn)
2.代码实现
2.1代码实现
class binarysort{
/**
* 找到相等的点
* @param aa
* @param target
* @return
*/
static int eq(int aa[],int target){
int l=0,r=aa.length-1;
while(l<=r){
int c=l+(r-l)/2;
if(aa[c]==target)return c;
else if(aa[c]>target)r=c-1;//r右边全都大于target
else l=c+1;//l左边全都小于target
}
return -1;
}
/**
* 找到第一个大于target的点
* @param aa
* @param target
* @return
*/
static int b(int aa[],int target){
int l=0,r=aa.length-1;
while(l<=r){
int c=l+(r-l)/2;
if(aa[c]>target)r=c-1;//r右边全都大于target
else l=c+1;//l左边全都小于等于target
//最终出循环一定是r=l-1
}
return l==aa.length?-1:l;
}
/**
* 找到第一个大于等于target的点
* @param aa
* @param target
* @return
*/
static int be(int aa[],int target){
int l=0,r=aa.length-1;
while(l<=r){
int c=l+(r-l)/2;
if(aa[c]>=target)r=c-1;//r右边全都大于等于target
else l=c+1;//l左边全都小于target
//最终出循环一定是r=l-1
}
return l==aa.length?-1:l;
}
/**
* 找到第一个小于target的下标
* @param aa
* @param target
* @return
*/
static int l(int aa[],int target){
int l=0,r=aa.length-1;
while(l<=r){
int c=l+(r-l)/2;
if(aa[c]>=target)r=c-1;//r右边全都大于等于target
else l=c+1;//l左边全都小于target
//最终出循环一定是r=l-1
}
return r;
}
/**
* 找到第一个小于等于target的下标
* @param aa
* @param target
* @return
*/
static int le(int aa[],int target){
int l=0,r=aa.length-1;
while(l<=r){
int c=l+(r-l)/2;
if(aa[c]>target)r=c-1;//r右边全都大于target
else l=c+1;//l左边全都小于等于target
//最终出循环一定是r=l-1
}
return r;
}
public static void main(String[]args){
int aa[]={1,2,3,4,5,5,5,6,7,8,9};
System.out.println(be(aa,5));
System.out.println(b(aa,4));
System.out.println(le(aa,5));
System.out.println(l(aa,6));
}
}