Given a sorted array of integers, 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]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
题目解析:
这道题目很典型,在二分查找的基础上,将等于target的判断归并到一边,会得到上界或者下届。那么我们需要写查找上下界的函数,又因为代码类似,就用一个bool值,来代表要找上届还是下届,归并成一个函数。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int FindPos(int A[],int lo,int hi,int target,bool fleft){
if(hi < lo)
return -1;
if(fleft == true){
while(lo <= hi){
int mid = (lo + hi)/2;
if(A[mid]<target) //通过分析,二分查找,利用一半相等一半不相等,来确定上下界!
lo = mid+1;
else
hi = mid-1;
}
return hi+1; //要留意返回值
}
while(lo <= hi){
int mid = (lo + hi)/2;
if(A[mid] <= target)
lo = mid + 1;
else
hi = mid - 1;
}
return lo-1;
}
vector<int> searchRange(int A[], int n, int target) {
vector<int> ans;
int left = FindPos(A,0,n-1,target,true);
int right = FindPos(A,0,n-1,target,false);
if(right < left){ //通过这句来判断是否存在target值,不存在就重新赋值成-1
left = -1;
right = -1;
}
ans.push_back(left);
ans.push_back(right);
return ans;
}
};
int main()
{
int arr[] = {5,7,7,8,8,9};
int n = sizeof(arr)/sizeof(int);
int target;
Solution tp;
while(cin >> target){
vector<int> vec;
vec = tp.searchRange(arr,n,target);
cout << "["<<vec[0] << "," << vec[1] << "]" << endl;
}
return 0;
}