版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目:
题解:
class Solution {
public:
//解法1:STL算法,时间复杂度为0(n),空间复杂度为O(1)
vector<int> searchRange_1(vector<int>& nums, int target) {
if(nums.empty())return {-1,-1};
vector<int> result;
auto it1=find(nums.begin(),nums.end(),target);//寻找第一个值为target的元素,获得指向该目标值的迭代器
if(it1!=nums.end())result.push_back(it1-nums.begin());
else return {-1,-1};
auto it2=find(nums.rbegin(),nums.rend(),target);//寻找最后一个值为target的元素,获得指向该目标值的迭代器
if(it2!=nums.rend())result.push_back(nums.rend()-it2-1);
return result;
}
//解法2:二分查找,时间复杂度O(logn),空间复杂度为O(1)
vector<int> searchRange_2(vector<int>& nums,int target)
{
if(nums.empty())return {-1,-1};
vector<int> result;
int left=0,right=nums.size()-1;
while(left<right)//从左边寻找第一个值为target的元素的位置,找到时left=right
{
int mid=left+((right-left)>>1);
if(nums[mid]>=target)right=mid;
else left=mid+1;
}
if(nums[left]!=target)return {-1,-1};//没找到目标值
result.push_back(left);//添加第一个值为target的元素下标
right=nums.size()-1;//重置right
while(left<right)//从右边寻找第一个值为target的元素的下标,找到是left=right
{
int mid=((right+left+1)>>1);//将mid的值加1/2,每次中间值落在右边
if(nums[mid]<=target)left=mid;
else right=mid-1;
}
result.push_back(right);
return result;
}
};