目录
1.有序数组,查找某个值
2.有序数组,找满足>=value的最左位置
@Test
public void test01(){
int[] arr={1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
System.out.println(binary02(arr,3));
}
public int binary02(int[] arr,int target){
if(arr==null || arr.length==0)
return -1;
int left=0,right=arr.length-1;
int index=-1;
while(left<=right){
int mid=left+((right-left)>>1);
if(arr[mid]>=target) {
index=mid;
right = mid - 1;
}
else
left=mid+1;
}
return index;
}
3.有序数组,找满足<=value的最右位置
@Test
public void test01(){
int[] arr={1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
System.out.println(arr.length-1);
System.out.println(binary03(arr,3));
}
public int binary03(int[] arr,int target){
if(arr==null || arr.length==0)
return -1;
int l=0,r=arr.length-1;
int index=-1;
while(l<=r){
int mid=l+((r-l)>>1);
if(arr[mid]<=target){
index=mid;
l=mid+1;
}
else
r=mid-1;
}
return index;
}
4.局部最小值——二分法不止用法有序数组上
定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。
注:数组中相邻的数不相等
public int binary04(int[] arr){
if(arr==null || arr.length==0)
return -1;
if(arr.length==1 || arr[0]<arr[1])
return 0;
if(arr[arr.length-1]<arr[arr.length-2])
return arr.length-1;
int left=1,right=arr.length-2;
while(left<right){
int mid=left+((right-left)>>1);
if(arr[mid]>arr[mid-1])
right=mid-1;
else if(arr[mid]>arr[mid+1])
left=mid+1;
else return mid;
}
return left;
}