34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
思路:
采用二分法,当前数大于目标数,则查找左半部分,当前数小于目标数,则查找右半部分,当等于目标数时,分别从左右两边进行查找,直到不等于目标数
返回两个数的数组
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//二分法 题目不是特别难,但是需要仔细考虑
int len=nums.size();
int low=0,high=len-1,mid;
vector<int> result(2,-1);
if(nums.size()==0){return result;}
while(low<=high){
mid=(high+low)/2;
if(target==nums[mid]){
int i=mid,j=mid;
while(i>=0&&nums[i]==target){i--;}
if(i<0) result[0]=0;
else result[0]=i+1;
while(j<len&&nums[j]==target){j++;}
if(j==len) result[1]=len-1;
else result[1]=j-1;
return result;
}
else if(target>nums[mid]){low=mid+1;}
else if(target<nums[mid]){high=mid-1;}
}
return result;
}
};