什么是二分查找
二分查找是一种常用的查找方法,每次都将查找区间减少一半,可以将时间复杂度减少到O(logn)。使用二分查找的前提是在一个有序的数组中,并且没有重复元素。
定义一个左指针left,右指针right,中间指针middle=(left+right)/2(可以写成left+(right-left)/2,防止数较大时溢出)。将要查找的值target与middle所指的值作比较,如果相等,查找完毕;如果target大,left向右移动;如果target小,right向左移动。
标准二分查找
int search(int nums[], int numsSize, int target){
int left = 0;
int right = numsSize - 1;
while(left <= right){
//(1)
int middle = left + (right - left) / 2;
if(target > nums[middle])
left = middle + 1;
else if(target < nums[middle])
right = middle - 1;
else
return middle;
}
return -1;
}
查找左边界
当数组中存在重复元素时,可以用二分法查找左边界,也就是最左边的此元素。原理是当第一次查找到此元素时,不知道是否为左边界,所以查找区间向左收缩,right移到middle的位置,舍弃右区间;至于target<nums[middle]可以合并到target==nums[middle]中。
int search(int nums[], int numsSize, int target){
int left = 0;
int right = numsSize - 1;
while(left < right){
//(2)
int middle = left + (right - left) / 2 ; //(3)
if(target > nums[middle])
left = middle +