leetcode 34题 search for a Range
题意为查找目标值的起始和结束位置,不存在则返回0.
用二分查找即可做到满足条件时间复杂度为O(lgn).我的思路是首先查找出第一个等于target的值,再在其左,右分别查找。
起初一直超时,原因是while的判断条件和对最左值的更新上,起初直接把最左值(head等)直接赋值为中间值,结果是跳不出循环因为/取小的那个,就会出不了循环。还有对第一次查找后的判断,当正常出循环而不是break 出循环时,需要判断是否是等于target。第一次的循环是为了缩小查找范围。
35题采用34题的第一部分再稍作修改即可
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> pos(2,-1);
if (nums.empty() || nums.back() < target)
return pos;
int head,tail,mid;
head = 0;
tail = nums.size() - 1;
if (head == tail)
{
if(target == nums[head])
{
pos[0] = head;
pos[1] = head;
}
return pos;
}
while(head < tail) //no mid element
{
mid = (head + tail)/2;
if(target == nums[mid])
{
break;
}
else if (target > nums[mid])
{
head = mid + 1;
}
else
tail = mid;
}
if (head == tail) //只有一个在最后,或者没有找到
{
if (nums[head]== target)
{
pos[0] = head;
pos[1] = head;
}
return pos;
}
int fistart = mid,fiend = mid,newmids = mid,newmide = mid;
while(head < newmids)
{
if(nums[(head + newmids)/2] < target)
{
head = (head + newmids)/2 + 1;
}
else
{
if(fistart > (head + newmids) / 2)
fistart = (head + newmids) / 2;
newmids = (head + newmids)/2;
}
}
while(newmide < tail )
{
if(nums[(newmide + tail)/2] > target)
{
tail = (newmide + tail)/2;
}
else
{
if(fiend < (newmide + tail)/2)
fiend = (newmide + tail)/2;
newmide = (tail + newmide)/2 + 1 ;
}
}
if (nums[newmide] == target)
fiend = newmide;
pos[0] = fistart;
pos[1] = fiend;
return pos;
}
};