private static boolean f(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return false;
}
int L = 0;
int R = arr.length - 1;
while (L <= R) {
int mid = (L + R) / 2;
if (arr[mid] == num) {
return true;
} else if (arr[mid] > num) {
R = mid - 1;
} else {
L = mid + 1;
}
}
return false;
}
习题2 有序数组中找到>=num最左的位置
private static int f1(int[] arr, int num) {
if (arr == null || arr.length < 1) {
return -1;
}
int L = 0;
int R = arr.length-1;
int ans = -1;
while(L<= R){
int mid = (L+R)/2;
if(arr[mid] < num){
L = mid +1;
} else {
ans = mid;
R = mid - 1;
}
}
return ans;
}
习题3 局部最小值问题(数组中的数保持相邻的两个数不相等的原则)
private static int f1(int[] arr) {
if (arr == null || arr.length < 1) {
return -1;
}
if (arr.length == 1) {
return 0;
}
int L = 0;
int R = arr.length - 1;
if (arr[L] < arr[L + 1]) {
return L;
}
if (arr[R] < arr[R - 1]) {
return R;
}
while (L <= R) {
int mid = (L + R) / 2;
if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {
return mid;
} else if (arr[mid] > arr[mid-1]) {
R = mid;
} else{
L = mid;
}
}
return -1;
}