class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1,mid=(left+right)/2;
while(mid!=left&&mid!=right&&(nums[mid]<nums[left]||nums[mid]>nums[right]))
{
if(nums[mid]<nums[left])
{
right=mid;
mid=(left+right)/2;
}
else if(nums[mid]>nums[right])
{
left=mid;
mid=(left+right)/2;
}
}//find out the position that was rotated by
if(left==0&&right==nums.size()-1&&nums[left]<nums[right])//if no rotation is done or two numbers are rotated, (3,1) as an example
return bisearch(left,right,nums,target);
int res=bisearch(0,left,nums,target);
return res==-1?bisearch(right,nums.size()-1,nums,target):res;
}
int bisearch(int left,int right,vector<int> nums,int target)
{
int mid=(left+right)/2;
while(left!=right)
{
if(nums[mid]==target)
return mid;
if(target>nums[mid])
left=mid+1;
else if(target<nums[mid])
right=mid;
mid=(left+right)/2;
}
if(nums[mid]==target)
return mid;
return -1;
}
};
Updated version, only need to do the binary search once.
class Solution {
public:
int search(vector<int>& nums, int target) {
int size=nums.size();
int l=0,r=size-1,mid=(l+r)/2;
while(l<r)
{
if(nums[mid]==target)
return mid;
if(nums[l]<=nums[mid])//left part is in order
{
if(target>=nums[l]&&target<nums[mid])//target is in the left part
r=mid;
else
l=mid+1;
}
else//right part is in order
{
if(target>nums[mid]&&target<=nums[r])//target is in the right part
l=mid+1;
else
r=mid;
}
mid=(l+r)/2;
}
return nums[mid]==target?mid:-1;//for vector that only contains one element
}
};