Given an array of integers 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].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
题意:在O(log n )的时间内找到给定target元素在数组中的范围下标。
方法:用两次二分,找出第一个比它大的(mmax)和最后一个比它小的(mmin)。
#include <iostream>
#include <vector>
using namespace std;
vector<int> searchRange(vector<int>& nums, int target)
{
//先找到最后一个比它小的,再找第一个比它大的
int len = nums.size();
int flag = -1; //判断是否有target
int mmin = -1, mmax = len;
int left = 0, right = len-1;
vector<int> res;
while(left <= right)
{
int mid = (left+right)/2;
if(nums[mid] == target)
{
flag = mid; break;
}
else if(nums[mid] < target)
left = mid+1;
else
right = mid-1;
}
if(flag == -1) //找不到target
{
mmin = -1; mmax = -1;
res.push_back(mmin);
res.push_back(mmax);
return res;
}
else
{
//cout<<flag<<endl;
//找出最后一个比它小的
left = 0; right = flag;
while(left <= right)
{
int mid = (left+right)/2;
if(nums[mid] < target)
{
if(mid+1 <= flag)
{
if(nums[mid+1] >= target)
{
mmin = mid; break;
}
else
{
left = mid+1;
}
}
else
break;
}
else//比target大
{
right = mid-1;
}
}
//cout<<mmin<<endl;
//找出第一个比它大的
left = flag; right = len-1;
while(left <= right)
{
int mid = (left+right)/2;
if(nums[mid] > target)
{
if(mid-1 >= 0)
{
if(nums[mid-1] <= target)
{
mmax = mid; break;
}
else
{
right = mid-1;
}
}
else
break;
}
else//不比target大
{
left = mid+1;
}
}
}
res.push_back(mmin+1);
res.push_back(mmax-1);
return res;
}
int main()
{
vector<int> v;
int num, target;
while(cin>>num)
{
v.clear();
for(int i=0;i<num;i++)
{
int t;
cin>>t;
v.push_back(t);
}
cin>>target;
vector<int>res = searchRange(v,target);
for(int i=0;i<res.size();i++)
{
cout<<res[i]<<" ";
}
cout<<endl;
}
return 0;
}