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; } };
囧,第一次二分完全多余。。