您的位置:首页 > 其它

Leetcode#34 Search for a Range

2015-07-11 16:11 381 查看
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]
.

Difficulty: Medium

典型的二分法应用,log(n)的复杂度。

vector<int> searchRange(vector<int>& nums, int target) {
int len = nums.size();
int start = 0;
int en = len - 1;
int middle,i = -1;
vector<int> ans;
if(len==1&&nums[0]==target)
{
ans.push_back(0);
ans.push_back(0);
return ans;
}
if(len==1&&nums[0]!=target)
{
ans.push_back(-1);
ans.push_back(-1);
return ans;
}//当长度为1时的两种情况

while(en>=start)
{
if(en-start==1&&nums[en]!=target&&nums[start]!=target)
break;
if(en-start==1&&nums[en]==target&&nums[start]!=target)
{
i = en;
break;
}
middle = start+((en-start)>>1);
if(nums[middle]==target)
{
i = middle;
break;
}
else if(nums[middle]>target)
en = middle;
else
start = middle;
} //先通过二分法找到至少一个目标的index
if(i==-1)
{
ans.push_back(-1);
ans.push_back(-1);
return ans;
}//若没有找到target,返回(-1,-1)
int j = i;
while(nums[j]==target&&j>=0)
j--;
ans.push_back(j+1);
j=i;
while(nums[j]==target&&j<len)
j++;
ans.push_back(j-1);//向前和向后找第一个和最后一个的index
return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: