1.题目:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。
2.示例:
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
3.思路:
a.遍历数组查找,时间复杂度为O(n);
b.二分查找,时间复杂度为O(logn).
4.代码:
a.
vector<int> searchRange(vector<int>& nums, int target) {
int begin=-1,end=-1;
int i=0;
while(i<nums.size()&&nums[i]<=target){
if(nums[i]==target&&begin==-1){
begin=i;
end=i;
}
if(nums[i]==target&&begin!=-1)
end=i;
i++;
}
return {begin,end};
}
b.
vector<int> searchRange(vector<int>& nums, int target) {
int l=0,r=nums.size()-1;
int m=-1;
//二分查找
while(l<=r){//避免数组只有一个数字的情况
m=(l+r)/2;
if(nums[m]==target)
break;
if(nums[m]>target) r=m-1;
if(nums[m]<target) l=m+1;
}
if(nums[m]!=target||m==-1) return {-1,-1}; //没找到target或nums为空。
int begin=m,end=m;
while(begin>0&&nums[begin-1]==target)
begin--;
while(end<nums.size()-1&&nums[end+1]==target)
end++;
return {begin,end};
}