题目描述:
给定一个按照升序排列的整数数组 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) {
vector<int> res;
res.push_back(-1);
res.push_back(-1);
if(nums.size()==0) return res;
if(nums.size()==1){
if(nums[0]==target){
res.clear();
res.push_back(0);
res.push_back(0);
return res;
}
}
int mid,low=0,high=nums.size()-1;
int min=nums.size(),max=-1;
while(low<=high){
mid=(low+high)/2;
if(nums[mid]<target) low=mid+1;
if(nums[mid]>target) high=mid-1;
if(nums[mid]==target){
if(mid<min) min=mid;
if(mid>max) max=mid;
low++;
}
}
low=0,high=nums.size()-1;
while(low<=high){
mid=(low+high)/2;
if(nums[mid]<target) low=mid+1;
if(nums[mid]>target) high=mid-1;
if(nums[mid]==target){
if(mid<min) min=mid;
if(mid>max) max=mid;
high--;
}
}
if(nums[mid]!=target) return res;
res.clear();
res.push_back(min);
res.push_back(max);
return res;
}
};
思路:
文章中要求复杂度log(n),所以还是用二分法。
这个题要搜索的数字与常规二分不一样的是,这里的数字可能会有重复,所以只要将常规二分搜索的截止条件nums[mid]==target;break; 换掉就可以了。
因为符合条件的数字可能不止一个,但它们肯定分布在搜索到的位置的两边,所以在找到目标值所在的位置后,还要继续进行搜索,不可以break。因为可能分布在两边,所有可以将low++,或者high--,二者都要进行,这样才能找全。