一、给出一个有序(小大)数组arr[],找出是否含有num
public static boolean find(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return false;
}
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == num) {
return true;
} else if (arr[mid] < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
二、给出一个有序(小大)数组arr[],找出大于等于num的最左位置
public static int find(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return -1;
}
int left = 0;
int right = arr.length - 1;
int temp = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == num) {
temp = mid;
right = mid -1;
} else if (arr[mid] < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return temp;
}
三、给出一个相邻不相等的数组arr[],找出局部最小值的位置
public static int find(int[] arr) {
int res = -1;
if (arr == null || arr.length == 0) {
return res;
}
if (arr.length == 1) {
return 0;
}
if (arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length - 1] < arr[arr.length - 2]) {
return arr.length - 1;
}
int left = 0;
int right = arr.length - 1;
while (left < right - 1) {
int mid = (left + right) / 2;
if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {
res = mid;
return res;
}
if (arr[mid] > arr[mid - 1]) {
right = mid - 1;
continue;
}
if (arr[mid] > arr[mid + 1]) {
left = mid + 1;
continue;
}
}
//如果运行到这一步,只剩两个没比较
res = arr[left] < arr[right] ? left : right;
return res;
}