因为复杂度肯定是logn,所以想到了和快速幂类似的方式,每次向外跨2的n次方直到先找到边界,找到后决定在哪部分进行二分。
但是我在实际编程的时候贼慢,主要原因在与向外跨的时候需要3个变量,一个是最左侧的位置,一个是本次跨到的位置,一个是下次跨到的位置。如果本次和下次不是单调的,就说明边界就在本次之后,让左侧等于左边界,再重复一便就可以了。直到这个点就是边界
clas
s Solution {
public:
int getbound(vector<int>nums)
{
int left= 0;
while(left+1<nums.size() && nums[left]<nums[left+1])
{
int next = left+1;
int i=0;
int cur = left;
while(next<nums.size())
{
if(nums[cur]<=nums[next])
cur = next;
else
break;
next = cur + (1<<i);///<每次向外扩2的
次方
i++;
}
left = cur;
}
return left;
}
int search(vector<int>& nums, int target) {
if(nums.empty())
return -1;
int bound = getbound(nums);
int start=0, end=nums.size();///<左闭右开
if(nums[0]>target)
{
start=bound+1;
end=nums.size();
}
else
{
start=0;
end=bound+1;
}
auto it = lower_bound(nums.begin()+start, nums.begin()+end, target);
int ret = -1;
if(it!=nums.begin()+end && *it==target)
ret = it-nums.begin();
return ret;
}
};