题目描述
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].
思路
用二分查找寻找等于目标值的下标,找到后向前向后搜索,找到目标值的起始索引和结束索引值。
C++实现
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
ret.push_back(-1);
ret.push_back(-1);
int l,r,m=0,t=-1,i,pm=-1;
l=0;
r=nums.size()-1;
while(l<r && nums[l]<target && nums[r]>target && r!=1)
{
m=(l+r)/2;
if(m==pm)
break;
pm=m;
if(nums[m]<target)
l=m;
else if(nums[m]>target)
r=m;
else break;
}
if(nums.size()>0)
{
if(nums[l]==target)
t=l;
if(nums[r]==target)
t=r;
if(nums[m]==target)
t=m;
if(t>=0)
{
for(i=t;nums[i]==target && i>=0;i--);
ret[0]=i+1;
for(i=t;nums[i]==target && i<nums.size();i++);
ret[1]=i-1;
}
}
return ret;
}
};
C实现
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize) {
int* ret=(int*)malloc(2*sizeof(int));
ret[0]=-1;
ret[1]=-1;
*returnSize=2;
if(numsSize==0)
return ret;
int l,r,m=0;
int t=-1;
int i;
l=0;
r=numsSize-1;
while(l<r && nums[l]<target && nums[r]>target)
{
m=(l+r)/2;
if(nums[m]<target)
l=m+1;
else if(nums[m]>target)
r=m-1;
else
break;
}
if(nums[l]==target)
t=l;
if(nums[r]==target)
t=r;
if(nums[m]==target)
t=m;
if(t>=0)
{
for(i=t;nums[i]==target && i>=0;i--);
ret[0]=i+1;
for(i=t;nums[i]==target && i<numsSize;i++);
ret[1]=i-1;
}
return ret;
}