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]
解题
复杂度logN,故需使用二分算法;
在判断输出的条件中增加判断是否为下标最边上的数即可;
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//logn 二分查找
if(!nums.size()) return {-1,-1}; //特殊情况
return {searchleft(nums,target),searchright(nums,target)};
}
private:
int searchleft(vector<int>&nums, int target){
int left=0;
int right=nums.size()-1;
int mid;
while(left<=right)
{
mid= left+(right-left)/2;
if(nums[mid]==target){
if(mid>0&&nums[mid-1]<target) return mid;
else if(mid==0) return mid;
else right=mid-1;
}
else if(nums[mid]<target) left=mid+1;
else right=mid-1;
}
return -1;
}
int searchright(vector<int>&nums, int target){
int left=0;
int right=nums.size()-1;
int mid;
while(left<=right)
{
mid= left+(right-left)/2;
if(nums[mid]==target){
if(mid<nums.size()-1&&nums[mid+1]>target) return mid;
else if(mid==nums.size()-1) return mid;
else left=mid+1;
}
else if(nums[mid]<target) left=mid+1;
else right=mid-1;
}
return -1;
}
};
注意点
在不确定数组中是否有所求元素时,需要用while(left<=right)遍历所有元素,而非while(left<right),这个公式当left==right时默认此数据为要求的数据,mid不会遍历该数;