Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
题意:一个有序数组经过旋转后成为一个新数组,在新的数组中查找给定的值,找到返回其下标,没找到返回-1
思路:二分查找的思路,从中间截取后一定会有一部分是有序的。
左侧若有序,则右侧可能有序;左侧若无序,则右侧一定有序。
判断左侧是否有序的方法是比较if (nums[left] <= nums[mid])。
若左侧有序,此时target>nums[mid]则递归查找右侧,
若target<nums[mid], 则比较target 与nums[left]的值,从而决定在哪里找target。
class Solution {
public:
int search(vector<int>& nums, int target) {
return binarySearch(nums, target, 0, nums.size() - 1);
}
int binarySearch(vector<int>& nums, int target, int left, int right){
while (left <= right){
int mid = (left + right) / 2;
if (target == nums[mid]){
return mid;
}
else if (target < nums[mid]){
//judge sorted
if (nums[left] <= nums[mid]){
//left part sorted
if (target > nums[left]){
//in left part
return binarySearch(nums, target, left + 1, mid - 1);
}
else if (target < nums[left]){
//in right part
return binarySearch(nums, target, mid + 1, right);
}
else if (target == nums[left])
return left;
}
else {
//right part sorted
return binarySearch(nums, target, left, mid - 1);
}
}
else{
//judge sorted
if (nums[left] <= nums[mid]){
//left part sorted
return binarySearch(nums, target, mid + 1, right);
}
else {
//right part sorted
if (target < nums[right]){
return binarySearch(nums, target, mid + 1, right - 1);
}
else if (target > nums[right])
return binarySearch(nums, target, left, mid - 1);
else
return right;
}
}
}
return -1;
}
};