问题描述:
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
解题思路:
这道题要求用logN的方法解决,我们就可以开始考虑二分搜索了。
这道题也不能简简单单的就用二分搜索了,因为并不是单调的排序,在某个不知道的地方,它rotate了一下。
这里就需要我们观察!
通过给的例子:[0,1,2,4,5,6,7] -> [4,5,6,7,0,1,2]
可以看出可能有以下rotate:
[1,2,4,5,6,7,0]
[2,4,5,6,7,0,1]
[4,5,6,7,0,1,2]
[5,6,7,0,1,2,4]
[6,7,0,1,2,4,5]
[7,0,1,2,4,5,6]
我们可以看出:当中间的数字小于最右时,右半部分为有序; 当中间的数字大于最左时,左半部分为有序
可以用这个与二分搜索相结合。
代码:
class Solution { public: int search(vector<int>& nums, int target) { if(nums.size() == 0) return -1; int left = 0; int right = nums.size() - 1; while(left <= right){ int mid = (left + right)/2; if(nums[mid] == target) return mid; else if(nums[mid] < nums[right]){ if(nums[mid] < target && target <= nums[right]){ left = mid + 1; }else{ right = mid - 1; } }else{ if(nums[left] <= target && nums[mid] > target) right = mid-1; else left = mid + 1; } } return -1; } };