Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,0 1 2 4 5 6 7might become4 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.
题意:在以某点旋转以后的有序数租中找目标值。数组中没有重复的元素。
思路:刚开始是否是求旋转之后(或者之前的)的目标值在数组中的下标,然后就写了一个遍历全数组的简单方法,发现是求现数组的下标(即旋转之后的)。当然若是直接遍历一遍数组,也可以找到,时间复杂为O(n)。题目给的原意不是这样的。所以尝试二分查找,发现当中间位置所对应的值小于最右边时,则,右边的是非降序列,此时只要判断目标值是否在这个区间内(如何判断?因为这段是非降的,所以只要取其首尾两个值和目标值对比即可),若在这个区间内,则对此区间进行下一次二分查找,若不在,则对左边进行二分查找;同理当中间值大于最右边值时,左边为非降序的,剩下的一样。
代码如下:
1 class Solution { 2 public: 3 int search(int A[], int n, int target) 4 { 5 if(n==0) return -1; 6 int lo=0,hi=n-1; 7 while(lo<=hi) 8 { 9 int mid=(lo+hi)/2; 10 if(A[mid]==target) 11 return mid; 12 else if(A[mid]<A[hi]) 13 { 14 if(A[mid]<target&&A[hi]>=target) 15 lo=mid+1; 16 else 17 hi=mid-1; 18 } 19 else 20 { 21 if(A[lo]<=target&&A[mid]>target) 22 hi=mid-1; 23 else 24 lo=mid+1; 25 } 26 } 27 return -1; 28 } 29 };