题目
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
一、循环条件:<=
代码如下(示例):
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int l=-1,r=-1;
l=search(nums,target);
if(!nums.size()||l >= nums.size()||nums[l]!=target )
{
return vector<int>{-1,-1};
}
else
{
r=search(nums,target+1);
return vector<int>{l,r-1};
}
}
int search(vector<int>& nums, int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=(right-left)/2+left;
if(nums[mid]>=target)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return left;
}
};
二、循环条件:<
参考:题解
这方法好麻烦
代码如下(示例):
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int l=-1,r=-1;
l=search(nums,target);
if(!nums.size()||l >= nums.size()||nums[l]!=target )
{
return vector<int>{-1,-1};
}
else if(nums.size()==1&&nums[l]==target)
{
//cout<<"1"<<endl;
return vector<int>{0,0};
}
else
{
r=search1(nums,target,l);
return vector<int>{l,r};
}
}
int search(vector<int>& nums, int target)
{
int left=0;
int right=nums.size()-1;
while(left<right)
{
int mid=(right-left)/2+left;
if(nums[mid]>=target)
{
right=mid;
}
else
{
left=mid+1;
}
}
return left;
}
int search1(vector<int>& nums, int target,int left)
{
//int left=0;
int right=nums.size()-1;
while(left<right)
{
int mid = (left + right +1)>>1;//向上取整
if(nums[mid] <= target) left = mid;//等号归左
else right = mid-1;//右减一
}
return right;
}
};