Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8 Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6 Output: [-1,-1]
Accepted
371,213
Submissions
1,076,399
class Solution {
public:
int bs(vector<int> &n,int t)
{
int l=0,r=n.size()-1,m;
while(l<=r)
{
m=(l+r)/2;
if(n[m]<t)
l=m+1;
else
r=m-1;
}
return l;
}
vector<int> searchRange(vector<int>& nums, int target) {
int idx1=bs(nums,target);
int idx2=bs(nums,target+1)-1;
if(idx1<nums.size()&&nums[idx1]==target)
return {idx1,idx2};
return {-1,-1};
}
};
二分查找有三个函数 ,
1 binary_search
2 lower_bound
3 upper_bound
本题用lower_bound即可解决.
这三个函数基本实现方法类似, 细微区别在于 1 需要用==来判断middle和target是否相等, 相等则返回.
2 是不判断相等,只判断 middle<target, 返回值不是middle,是left
3 同理, 只判断target<middle
private static int lowerBound(int[] a, int low, int high, int element){
while(low < high){
int middle = low + (high - low)/2;
if(element > a[middle])
low = middle + 1;
else
high = middle;
}
return low;
}
private static int upperBound(int[] a, int low, int high, int element){
while(low < high){
int middle = low + (high - low)/2;
if(a[middle] > element)
high = middle;
else
low = middle + 1;
}
return low;
}