二分时间复杂度(logN)
二分查找是否存在
二分查找要求线性表必须采用顺序存储结构。
1.假设按升序排列,将表中间位置记录的关键字(下标为middle)与查找关键字(value)比较,
如果midvalue=value,则查找成功;
否则利用midvalue将表分成前、后两个子表,如果midvalue>value,则进一步查找前一子表,
否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
public class Code01_BinarySearch {
//二分查找对应的num数,要求arr有序
public static boolean find(int arr[] ,int num){
if(arr == null || arr.length == 0){
return false;
}
int L = 0 ;
int R = arr.length -1;
while (L <= R ){
int middle = ( L + R) / 2;
if(arr[middle] == num ){
return true;
}else if(arr[middle] < num){
L = middle + 1;
}else if(arr[middle] > num){
R = middle - 1;
}
}
return false;
}
}
二分查找,>=value,最左的下标位置
public class Code01_BinarySearchMostLeft {
//使用二分查找,arr中(有序),满足 >=value最左的位置
public static int mostLeftIndex(int[]arr ,int num){
if(arr == null || arr.length == 0){
return -1;
}
int L= 0;
int R = arr.length -1 ;
//定义一个需要返回的index,默认-1
int ans = -1;
while (L<=R){
int middle = (L+R) / 2 ;
if(arr[middle] >= num){
ans = middle;
R = middle - 1;
}else if(arr[middle] < num){
L = middle + 1;
}
}
return ans;
}
}
**
二分查找,<=value,最右的下标位置
**
public class Code01_BinarySearchMostRight {
//使用二分查找,arr中(有序),满足 >=value最右的位置
public static int mostRightIndex(int[]arr ,int num){
if(arr == null || arr.length == 0){
return -1;
}
int L= 0;
int R = arr.length -1 ;
//定义一个需要返回的index,默认-1
int ans = -1;
while (L<=R){
int middle = (L+R) / 2 ;
if(arr[middle] > num){
R = middle - 1;
}else if(arr[middle] <= num){
ans = middle;
L = middle + 1;
}
}
return ans;
}
}
二分查找,局部最小,arr无序,相邻不相等()
public class Code01_BinarySearchMinWesome {
//二分查找 局部最小值,arr无序,相邻不相等,返回下标
public static int find(int arr[] ){
if(arr == null || arr.length == 0){
return -1;
}
int N = arr.length ;
if(N == 1){
return 0;
}
if(N == 2){
return arr[0] > arr[1] ? 1: 0;
}
int L = 0 ;
int R = N -1;
//返回变量 默认-1
while(L< R -1){
int middle = (L+R)/2;
//如果中间位置的数,既是小于左边,又小于右边,返回
if(arr[middle]<arr[middle-1] && arr[middle]<arr[middle+1]){
return middle;
}else{
if(arr[middle] > arr[middle-1]){
R = middle - 1;
}else{
L = middle + 1 ;
}
}
}
return arr[L] > arr[R] ? R :L;
}
}