只要能保证 一边一定有,或一边一定没有,就可以使用二分法查找,并不要求一定有序。
时间复杂度 O(log n)
获取有序列表中 指定元素首次出现的下标
public class Main {
public static void main(String[] args) {
}
private static int getIndex(int[] nums, int target) {
int max = nums.length - 1;
int min = 0;
int mid = 0;
while (max >= min) {
// 正整数 N / 2 等价于 N >> 1
// 等价于 mid = (min + max) / 2;
// 相加运算,容易溢出,右移更安全,更快速
mid = min + (max - min) >> 1;
if (nums[mid] == target) {
while (mid >= 1 && nums[mid] == nums[mid - 1]) {
mid--;
}
return mid;
}
if (nums[mid] > target) {
max = mid - 1;
} else {
min = mid + 1;
}
}
return -1;
}
}