先利用二分查找去找分界点,然后就可以分为2个有序区间,在某一个区间里再二分查找。
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.empty())
return -1;
int point = findPartition(nums);
//如果没有分界点,则说明只有一段有序区间,直接普通二分查找
if (point == -1) return binarySearch(nums, 0, nums.size() - 1, target);
//分界点刚好是要找的点
else if (nums[point] == target) return point;
//要找的点在后半段
else if (target < nums[0]) return binarySearch(nums, point + 1, nums.size() - 1, target);
//要找的点在前半段
else return binarySearch(nums, 0, point + 1, target);
}
//二分查找分界点
int findPartition(vector<int>& nums) {
int left = 0, right = (int)nums.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (mid < right && nums[mid] > nums[mid + 1]) return mid;
if (mid > left && nums[mid] < nums[mid - 1]) return mid - 1;
if (nums[mid] < nums[left]) right = mid - 1;
else left = mid + 1;
}
return -1;
}
//普通的二分查找
int binarySearch(vector<int>& nums, int start, int end, int target) {
int left = start, right = end;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
};