**
题目描述
假设一个升序数组以某个轴做了旋转,例如[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2],在其中检索某个值是否存在。
若存在返回位置,否则返回-1。
样例
input:
nums = [4,5,6,7,0,1,2], target = 0
output: 4
input:
nums = [4,5,6,7,0,1,2], target = 3
output: -1
额外要求
时间复杂度必须是O(logn)。
**
还是这个图
这题如果是上图这种情况,那么要分两段进行二分,这两段的边界就是最小值,因此要先找出最小值,然后对两段进行二分,目标要么在最小值左边,要么在最小值右边,通过改变l,r,采取不同的二分,只需要再进行一次二分即可,最多两次二分,时间复杂度logn。
如果是单调递增,进行一次二分即可。
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int n=nums.size();
if(n==0)
return -1;//数组为空
int l=0,r=n-1;
while(l<r)//找到最小值,函数单调进行这一步也无妨
{
int mid=l+r>>1;
if(nums[mid]<nums[0])
r=mid;
else
l=mid+1;
}
if(target>=nums[0])//目标在最小值左半段
l=0,r--;
else //目标在右半段
r=n-1;
if(nums[n-1]>nums[0])
l=0,r=n-1;//数组单调递增的情况,这种情况的l,r赋值要放在上面if,else后面
while(l<r)
{
int mid=l+r>>1;
if(nums[mid]>=target)
r=mid;
else
l=mid+1;
}
if(nums[l]!=target)
return -1;
return l;
}
};