思路:
二分法, 主要分两大种情况, 第一种是当前范围已经排好序了, 直接用传统二分法查找即可.
第二种是, 当前范围的最左值大于最右值, 说明数组有旋转, 那么再看目标值是属于左半边还是右半边, 再调整范围值即可
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
if (target == nums[left]) return left;
if (target == nums[right]) return right;
int mid = (left + right) >> 1;
if (target == nums[mid]) return mid;
// 第一大种情况, nums[left...right]是有序数组
if (nums[left] < nums[right]) {
if (target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
// 第二大种情况的第一种情况, 左半边是排好序的
else if (nums[left] < nums[mid]) {
if (target > nums[left] && target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
// 第二大种情况的第二种情况, 右半边是排好序的
else {
if (target > nums[mid] && target < nums[right])
left = mid + 1;
else
right = mid - 1;
}
}
return -1;
}