二分法 O(log N)
二分法,只要能构建出来能排他的条件,就能使用二分法
- 在有序数组中找值
public int findVal(int[] arr, int Q) {
int L = 0, R = arr.length - 1, mid;
while (L < R) {
mid = L + ((R - L) >> 1);
if (arr[mid] == Q) {
return mid;
}
if (arr[mid] > Q) {
R = mid;
} else {
L = mid;
}
}
return arr[L] == Q ? L : -1;
}
- 在有序数组中,找到 >= a 的最左下标
public int findLeftGreaterVal(int[] arr, int Q) {
int L = 0, R = arr.length - 1, mid, index = -1;
while (L <= R) {
mid = L + ((R - L) >> 1);
if (arr[mid] >= Q) {
index = mid;
R = mid;
} else {
L = mid;
}
}
return index;
}
- 局部最小值 a[i] < a[i + 1] && a[i] < a[i - 1],越界不比较。无序数组,任一两个相邻的数不相等,找出任一局部最小值
public int findPartMin(int[] arr) {
if (arr.length == 0) {
return -1;
}
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 L = 1, R = arr.length - 2, mid;
while (L < R) {
mid = L + ((R - L) >> 1);
if (arr[mid] > arr[mid - 1]) {
R = mid;
} else if (arr[mid] > arr[mid + 1]) {
L = mid;
} else {
return mid;
}
}
return L;
}