常见的二分查找问题
1 给定排序数组求一个给定数在数组中的下标,如果不存在就返回应该插入的位置
代码:
int searchInsert(int A[], int n, int target){
if(n==0)
return 0;
int start=0;
int end=n-1;
while(start<=end){
int mid=(start+end)>>1;
if(target==A[mid])
return mid;
else if(A[mid]>target){
end=mid-1;
}else{
start=mid+1;
}
}
return start;
}
2 给定一个 排序数组,然后经过旋转后,查找给定值是否在数组中。
思路 1 先看左边有序还是右边有序,再利用二分查找
代码
int search(int A[], int n, int target) {
if(n==0)
return -1;
int start=0;
int end=n-1;
while(start<=end){
int mid=(start+end)>>1;
if(A[mid]==target)
return mid;
else if(A[mid]>=A[start]){ //左边有序
if(A[start]<=target&&target<A[mid])
end=mid-1;
else
start=mid+1;
} else{ //右边有序
if(target<=A[end]&&target>A[mid])
start=mid+1;
else
end=mid-1;
}
}
return -1;
}
3 给定一个排序数组,数组中的数可以重复。找出给定数的 起始和终止位置
代码
vector<int> searchRange(int A[], int n, int target) {
int start=0;
int end=n-1;
vector<int> result(2,-1);
if(n==0)
return result;
while(start<=end){
int mid=(start+end)>>1;
if(A[mid]==target){
int index=mid;
while(index>=0&&A[index]==target)
index--;
result[0]=index+1;
index=mid;
while(index<n&&A[index]==target)
index++;
result[1]=index-1;
break;
}else if(A[mid]<target){
start=mid+1;
}else{
end=mid-1;
}
}
return result;
}