Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example, Given [5, 7, 7, 8, 8, 10] and target value 8, return [3, 4].
思考:3次二分搜索。第一次看是否存在target,第二次寻找最左下标,第三次寻找最右下标。
class Solution {
private:
vector<int> ret;
public:
vector<int> searchRange(int A[], int n, int target) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
ret.clear();
int left=-1;
int right=-1;
int i=0;
int j=n-1;
int mid;
bool flag=false;
while(i<=j)
{
mid=(i+j)>>1;
if(A[mid]>target) j=mid-1;
else if(A[mid]<target) i=mid+1;
else
{
flag=true;
left=mid;
right=mid;
int a=i;
int b=j;
while(a<=left)
{
mid=(a+left)>>1;
if(A[mid]<target) a=mid+1;
else if((mid>0&&A[mid-1]!=target)||mid==0)//考虑边界情况
{
left=mid;
break;
}
else left=mid-1;
}
while(right<=b)
{
mid=(right+b)>>1;
if(A[mid]>target) b=mid-1;
else if((mid<n-1&&A[mid+1]!=target)||mid==n-1)
{
right=mid;
break;
}
else right=mid+1;
}
if(flag)
{
ret.push_back(left);
ret.push_back(right);
}
return ret;
}
}
ret.push_back(-1);
ret.push_back(-1);
return ret;
}
};
囧,第一次二分完全多余。。