Suppose an array sorted in ascending order 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.
Your algorithm's runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2]
, target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2]
, target = 3
Output: -1
方法1:先用二分查找找到最小值,判断目标值在哪个区间中,再通过二分查找找到目标值。
class Solution {
public:
int search(vector<int>& nums, int target) {
int n=nums.size();
if(n==0) return -1;
int min=nums[0],minIndex=0;
int left=0,right=n-1,mid;
while(left<=right){
mid=(right+left)/2;
if(nums[mid]<min){
right=mid-1;
min=nums[mid];
minIndex=mid;
} else left=mid+1;
}
if(nums[0]>target){
left=minIndex;
right=n-1;
}else{
left=0;
if(minIndex==0) right=n-1;
else right=minIndex-1;
}
while(left<=right){
mid=(right+left)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]>target) right=mid-1;
else left=mid+1;
}
return -1;
}
};
注:原有序数组有可能从0开始折叠,即没有旋转,要对此进行特殊处理。