Question34–Search for a Range
给定一个按升序排列的可以有重复元素的数组,同时给出一个目标元素target,返回target在数组中的开始下标和结束下标。若不在数组中,返回[-1,-1]. eg:[1,2,2,4,5,5,7]和5,则返回[4,5]。
算法
- 使用二分法,缩小区间,直到中间位置为target。
- 分别在找到target的那个区间的左、右区间进行二分查找,确定target的开始位置和结束位置。
Code
vector<int> searchRange(vector<int>& nums, int target) {
int i=0, j=nums.size()-1;
int start=-1, end=-1;
while(i<=j){
int mid=(i+j)/2;
if(target<nums[mid]) j=mid-1;
else if(target>nums[mid]) i=mid+1;
else{
int p,q;
p=i;
q=mid;
while(p<q){
int leftmid=(p+q)/2;
if(nums[leftmid]==target) q=leftmid;
if(nums[leftmid]<target) p=leftmid+1;
}
start=q;
p=mid;
q=j;
while(p<q){
int rightmid=(p+q+1)/2;
if(nums[rightmid]==target) p=rightmid;
if(nums[rightmid]>target) q=rightmid-1;
}
end=p;
break;
}
}
vector<int> range{start,end};
return range;
}