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 .
For example, Given and target value 8, return .
代码如下:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
// lower_bound函数找到第一个大于或者等于target的位置
int left = distance(nums.begin(),lower_bound(nums.begin(),nums.end(),target));
// upper_bound函数找到第一个大于target的位置
int right = distance(nums.begin(),prev(upper_bound(nums.begin(),nums.end(),target)));
// 上述函数可能返回last
if(nums[left] != target)
return vector<int> {-1,-1};
else
return vector<int> {left,right};
}
template<typename ForwardIterator, typename T>
ForwardIterator lower_bound(ForwardIterator start, ForwardIterator end, T target) {
while(start != end) {
auto mid = next(start, distance(start, end)/2);
if(*mid < target) start = mid + 1;
else end = mid;
}
return start;
}
template<typename ForwardIterator, typename T>
ForwardIterator upper_bound(ForwardIterator start, ForwardIterator end, T target) {
while(start != end) {
auto mid = next(start, distance(start, end)/2);
if(*mid <= target) start = mid + 1; // upper_bound函数仅改行与lower_bound不一样
else end = mid;
}
return start;
}
};