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]
.
class Solution {
public:
vector<int> searchRange(int A[], int n, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<int> result(2,-1);
int low = FindLowerBound(A,0, n-1 ,target,n);
low = low + 1; //move to next element
if(A[low] == target)
result[0] = low;
else
return result;
int upper = FindUpperBound(A,0, n-1 ,target,n);
upper = upper < 0? (n-1):(upper - 1);
result[1] = upper;
return result;
}
int FindUpperBound(int A[], int start, int end, int target,int n){
if (start > end || A[end] <= target)
return -1;
if (start == end)
return start;
int mid = (start+end)/2;
if (A[mid] <= target){
if (mid > 0 && A[mid-1] == target)
return mid;
else
FindUpperBound(A,mid+1, end ,target,n);
}
else
FindUpperBound(A,start, mid ,target,n);
}
int FindLowerBound(int A[], int start, int end, int target, int n){
if (start > end|| A[start] >= target)
return -1;
if (start == end)
return start;
int mid = (start+end+1)/2;
if (A[mid] >= target ){
if (mid+1<n && A[mid+1] == target )
return mid;
else
FindLowerBound(A, start, mid-1, target,n);
}
else{
FindLowerBound(A, mid, end, target,n);
}
}
};