有序数组
使用二分法查找指定数值
public static boolean exist(int[] arr,int num){
if (null==arr||arr.length==0)
return false;
int L = 0;
int R = arr.length -1;
int mid = 0;
while (L<R){
//(L+R)/2在L与R接近极限的时候,计算会溢出,R-L带符号右移1位即除以2
mid = L + ((R - L) >> 1);
if (arr[mid] == num)
return true;
else if (arr[mid] > num)
R = mid - 1;
else
L = mid + 1;
}
return arr[L] == num;
}
找>=某个数最左侧位置
//arr中,找满足>=value的最左位置值
public static int nearestLeftIndex(int[] arr,int value){
int L = 0;
int R = arr.length-1;
int index = -1;
int mid = 0;
while (L<=R){
mid = L + ((R-L)>>1);
if (arr[mid]>=value){
index = mid;
R = mid - 1;
}else{
L = mid + 1;
}
}
return index;
}
找<=某个数最右侧位置
//<=value的最右边位置值
public static int nearestRightIndex(int[] arr,int value){
int L = 0;
int R = arr.length;
int index = -1;
int mid = 0;
while (L<=R){
mid = L + ((R-L)>>1);
if (arr[mid]<=value){
index = mid;
L = mid + 1;
}else{
R = mid - 1;
}
}
return index;
}
无序数组
局部最小值
无序数组,任何两个相邻的数不相等,找出任一局部最小值 即 arr[i-1]>arr[i]<arr[i+1]
- 若0~1单调递增,那么返回0位置,
- 若N-2~N-1单调递减,返回N-1位置
- 若0~1递减且N-2~N-1递增,那么在1~N-2中必有一个值满足局部最小条件(具体证明参考罗尔中值定理)
- 这种特殊的情景下,无序数组也可以使用二分法,如下
public static int getLessIndex(int[] arr){
if (null==arr||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 L = 1;
int R = arr.length - 2;
int mid = 0;
while (L < R){
mid = L + ((R-L)>>1);
if (arr[mid] > arr[mid-1]){
R = mid - 1;
}else if (arr[mid] > arr[mid+1]){
L = mid + 1;
}else{
return mid;
}
}
return L;
}