题目:
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.
题意:
给定一个经过一个pivot(中心点)旋转过后的已经经过排序过得数组。(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
在该数组中搜索给定的target目标值,如果在数组中找到,则返回其下标,未找到则返回-1.
可以假设给定的数组中不存在重复值。
思路一:
直接使用二分查找。
代码:4ms
class Solution { public: int search(vector<int>& nums, int target) { int first = 0; int last = nums.size(); while(first!=last){ const int mid = first + (last-first) / 2; if(nums[mid]==target){ return mid; } if(nums[first]<nums[mid]){ if(nums[first]<=target && target<nums[mid]){ last = mid; }else{ first = mid+1; } }else if(nums[first]>nums[mid]){ if(nums[mid]<target && target<=nums[last-1]){ first = mid+1; }else{ last = mid; } }else{ first++; } } return -1; } };思路二:
利用二分查找先找到该数组是从哪个位置旋转的,之后再利用二分查找。
转载链接:https://leetcode.com/discuss/11701/concise-o-log-n-binary-search-solution
代码:
class Solution { public: int search(vector<int>& nums, int target) { int n = nums.size(); int lo=0,hi=n-1; // find the index of the smallest value using binary search. // Loop will terminate since mid < hi, and lo or hi will shrink by at least 1. // Proof by contradiction that mid < hi: if mid==hi, then lo==hi and loop would have been terminated. while(lo<hi){ int mid=(lo+hi)/2; if(nums[mid]>nums[hi]) { lo=mid+1; }else{ hi=mid; } } // lo==hi is the index of the smallest value and also the number of places rotated. int rot=lo; lo=0; hi=n-1; // The usual binary search and accounting for rotation. while(lo<=hi){ int mid=(lo+hi)/2; int realmid=(mid+rot)%n; if(nums[realmid]==target){ return realmid; } if(nums[realmid]<target){ lo=mid+1; }else{ hi=mid-1; } } return -1; } };