class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int mid = 0;
int right = nums.size()-1;
if(right < 0) return -1;
// 如果不是旋转数组 直接二分查找
if(nums[right] >= nums[left] )
{
while(left <= right)
{
mid = left + (right - left)/2;
if( target == nums[mid]) return mid;
if( target < nums[mid]) right = mid-1;
else left = mid + 1;
}
return -1;
}
//是旋转数组,找出旋转点
while(left < right)
{
mid = left + (right - left)/2;
if( nums[right] > nums[mid]) right = mid;
else left = mid + 1;
}
int split = left;
//判断target是否在旋转点以后的数组里
left = 0;
right = nums.size()-1;
if(target == nums[split] ) return split;
if(target == nums[right] ) return right;
if(target > nums[split] && target < nums[right]) left = split+1;
else right = split - 1;
/再次二分查找
while(left <= right)
{
mid = left + (right - left)/2;
if( target == nums[mid]) return mid;
if( target < nums[mid]) right = mid-1;
else left = mid+1;
}
return -1;
}
};