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
方法解析:使用二分搜索
lo = 0 ; hi = nums.size()-1, mid = lo + (hi - lo)/2
if nums[lo] <= nums[mid] 则[lo,mid]为不递减区间,
if target in [lo,mid] , hi = mid - 1;
if target not in [lo,mid], lo = mid + 1;
if nums[lo] > nums[mid] 则[mid,hi]为不递减区间
if target in [mid,hi], lo = mid + 1;
if target not in [mid,hi], hi = mid - 1;
如此搜索,直至target==nums[mid], return mid 或者lo > hi,return -1
class Solution {
public:
int search(vector<int>& nums, int target) {
int lo = 0;
int hi = nums.size()-1;
int mid;
while(lo <= hi)
{
mid = lo + (hi -lo)/2 ;
if(target == nums[mid])
return mid;
if(nums[lo] <= nums[mid])
{
if(target < nums[mid] && target >= nums[lo])
{
hi = mid-1;
}
else
{
lo = mid+1;
}
}
else if(nums[lo] > nums[mid])
{
if(target > nums[mid] && target <= nums[hi])
{
lo = mid+1;
}
else
{
hi = mid-1;
}
}
}
return -1;
}
};