文章目录
leetcode34:34. 在排序数组中查找元素的第一个和最后一个位置
题目描述
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是O(log n)
级别。
如果数组中不存在目标值,返回[-1, -1]
。
Example
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
solution idea
二分查找
- 题目要找到一种
O(logN)
时间内的搜索方法,这提示我们可以用二分查找的方法 - 二分部分递归操作,终止情型是在中点出的值等于
target
,此时分别向左和向右寻找最小和最大指标
class Solution {
public:
vector<int> findlr(vector<int>& nums,int target,int loc)
// nums[loc]==target 情型下 寻找开始位置和结束位置
{
vector<int> res;
if(nums[loc]!=target)
{
res={-1,-1};
return res;
}
int left=loc,right=loc;
while((left-1)>=0 && nums[left]==nums[left-1]) left--;//向左搜索
while((right+1)<=nums.size()-1 && nums[right]==nums[right+1]) right++;//向右搜索
res={left,right};
return res;
}
vector<int> searchRange(vector<int>& nums, int target) {
int len=nums.size();
vector<int> res;
if (len==0)
{
res={-1,-1};
return res;
}
if (len==1 && nums[0]==target)
{
res={0,0};
return res;
}
if(len==1 && nums[0]!=target)
{
res={-1,-1};
return res;
}
int left=0,right=len-1; //二分查找
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target) return findlr(nums,target,mid);
else if(nums[mid]<target) left=mid+1;
else right=mid-1;
}
res={-1,-1};
return res;
}
};
c++ 语法
容器赋值 :
vector<int> res;
res={-1,-1};
<=>
vector<int> res;
res.push_back(-1);
res.push_back(-1);
参考文献
- c++ prime 第5版