所有不会做这道题的人应该好好的去研究下STL源码的lower_bound和upper_bound,两个都是用二分查找法实现的。只要仿照着写就好了。
http://www.cplusplus.com/reference/algorithm/lower_bound/
http://www.cplusplus.com/reference/algorithm/upper_bound/
lower_bound:
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator it;
iterator_traits<ForwardIterator>::difference_type count, step;
count = distance(first,last);
while (count>0)
{
it = first; step=count/2; advance (it,step);
if (*it<val) { // or: if (comp(*it,val)), for version (2)
first=++it;
count-=step+1;
}
else count=step;
}
return first;
}
upper_bound:
template <class ForwardIterator, class T>
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator it;
iterator_traits<ForwardIterator>::difference_type count, step;
count = std::distance(first,last);
while (count>0)
{
it = first; step=count/2; std::advance (it,step);
if (!(val<*it)) // or: if (!comp(val,*it)), for version (2)
{ first=++it; count-=step+1; }
else count=step;
}
return first;
}
Given an array of integers nums
sorted in ascending order, 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]
.
Example 1:
Input: noms = [5,7,7,8,8,10], target = 8;
Output: [3,4];
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8;
Output: [-1, -1];
AC代码:
vector<int> searchRange(vector<int>& nums, int target) {
int first, second;
int lo = 0, hi = nums.size();
while(lo < hi){
int mid = (lo + hi)/2;
if(nums[mid] >= target)
hi = mid;
else
lo = mid + 1;
}
first = lo;
lo = 0; hi = nums.size();
while(lo < hi){
int mid = (lo + hi)/2;
if(nums[mid] > target)
hi = mid;
else
lo = mid + 1;
}
second = lo;
return (first == second) ? vector<int> {-1,-1} : vector<int>{first, second -1};
}