例题:leetcode第34题
在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 二分查找的时间复杂度为O(log n)
![](https://i-blog.csdnimg.cn/blog_migrate/e20ad86900285e8d59a3376ccfa9bc63.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6799b87355d636e9b691622786ae2c8c.png)
解答:
class Solution {
public:
int Low(vector<int>&nums,int target){ //此函数为查找最小下标的函数
int l=0,r=nums.size()-1; //l指left,r指right
while(l<=r){
int mid = (r-l)/2+l;
if(nums[mid]>=target){ //因为是查找最小下标的函数,所以当nums[mid]==target时,我们选择将r=mid-1;
r=mid-1;
}else {
l=mid+1;
}
}return l;
}
int Hign(vector<int>&nums,int target){ //此函数为查找最大下标的函数
int l=0,r=nums.size()-1;
while(l<=r){
int mid = (r-l)/2+l;
if(nums[mid]<=target){ //因为是查找最大下标的函数,所以当nums[mid]==target时,我们选择将l=mid+1;
l=mid+1;
}else {
r=mid-1;
}
}return r;
}
vector<int> searchRange(vector<int>& nums, int target) {
int Min=Low(nums,target);
int Max=Hign(nums,target);
if(Min==nums.size()||nums[Min]!=target) return vector<int>{-1,-1};
//Min==nums.size()指当最小值已经超过整个数组长度时
return vector<int>{Min,Max};
}
};