计算机低能儿从0刷leetcode | 34.在排序数组中查找元素的第一个和最后一个位置 | 二分法
题目:34. 在排序数组中查找元素的第一个和最后一个位置
思路:这道题感觉比33题要简单很多,思路也很顺畅,主要分为两部分。
1、寻找左端点。我们还是使用二分查找,依然是比mid小去左侧,比mid大去右侧。区别是当target == nums[mid]的时候,如果mid-1存在,我们判断nums[mid-1]是否也等于target,如果是就向左查找,因为左端点一定在左侧,否则向右查找。
2、从确定好的左端点位置向右遍历数组,直到找到右端点。
代码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int len = nums.size();
int l=0,r=len-1;
int left=-1,right=-1;
if(len==0) return {-1,-1};
//左端点
while(l<=r){
int mid = (l+r)/2;
if(target<nums[mid]) r=mid-1;
else if(target>nums[mid]) l=mid+1;
else if(target==nums[mid]){
if(mid>0&&nums[mid-1]==nums[mid])
r=mid-1;
else {left=mid;break;}
}
}
//右端点
right=left;
while(right<len-1&&nums[right+1]==target)
right++;
vector<int> res={left,right};
return res;
}
};