题目:
(1)在有序数组中找某个数是否存在
(2)在有序数组中,找满足>=某个数的最左位置
分析:
(1)如果直接从头到尾依次进行比较, 时间复杂度为O(N); 如果采用二分法, 时间复杂度为O(log2^N)
(2)相较于第一题中找到满足条件的位置就停止, 该题目需要一直二分到结束
代码实现:
public static boolean exist(int[] sortedArr, int num) {
/**
* 题(1)
*/
if (sortedArr == null || sortedArr.length == 0) {
return false;
}
int L = 0;
int R = sortedArr.length - 1;
int mid = 0;
while (L < R) {
mid = L + ((R - L) >> 1);
if (sortedArr[mid] == num) {
return true;
} else if (sortedArr[mid] > num) {
R = mid - 1;
} else {
L = mid + 1;
}
}
return sortedArr[L] == num;
}
public static int nearestIndex(int[] sortedArr, int value) {
/**
* 题(2)
*/
int L = 0;
int R = sortedArr.length - 1;
int index = -1;
while (L < R) {
int mid = L + ((R - L) >> 1);
if (sortedArr[mid] >= value) {
index = mid;
R = mid - 1;
} else {
L = mid + 1;
}
}
return index;
}