题目描述
Given an array of integers 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].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]
代码及注释
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};
}
};
分析
有序数组的查找问题,一般都采用二分法求解。但此处我们直接使用STL模板里的函数帮助我们。实际上这两个函数本身也是二分法实现的。下面介绍一下这两个函数。
- ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)[算法]返回一个非递减序列[first, last)中的第一个大于等于值val的位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!
- ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。
(注意这两个函数返回的是一个迭代器,不可以直接赋值为int类型,需要通过distance函数转换)