我们知道在一个有序数组里面查找一个元素使用二分操作能达到Olg(n)的复杂度,但是传统的二分查找找到的元素是无法确认找的的是哪一个元素的。这么说可能比较抽象,举个例子,如果待查找的元素在有序数组中只出现了一次,那么查找到的索引肯定就是该元素出现的索引位置,如果该元素出现了多次,那么传统的二分查找是无法确定返回的索引值是具体哪一个的。
传统的二分查找:
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return -1;
int lo = 0;
int hi = nums.length - 1;
while(lo <= hi) {
int mid = (lo + hi) / 2;
if(target > nums[mid]) {
lo = mid + 1;
} else if(target < nums[mid]) {
hi = mid - 1;
} else {
return mid;
}
}
return -1; // 没有出现, 返回-1
}
返回最左边的出现的索引值:
public int search(int[] nums, int target) {
if (nums == null || n