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).
Find the minimum element.
You may assume no duplicate exists in the array.
转载:http://www.cnblogs.com/lichen782/p/leetcode_Search_in_Rotated_Sorted_Array.html
就是说,排序数组可能是右移了一定位数。让你在这个数组中找一个target值。当然用线性查找就没意义了。
想这个解法需要头脑比较清晰。记得原来高中做题,老师最常说的一句话是啥?”要揣摩出题人意图啊“。。。这道题也是这样的。如果是在一个有序数组里面找一个值,那么一般都是用binarySearch。现在数组变了,(当然,还保持一些其他特点,我们下面说),能不能用binarySearch呢,或者我们改一下binarySearch呢?
如果用binarySearch,我们在通过Low和High序号得到Mid以后,应该如何剔除一半的数据呢?
下面是rotate后的一个有序数组的图。四边形的斜边表示数组中数值的大小。
在这种情况下数组分了两部分,分别都是有序(递增)的。
当我们计算了Mid以后,有两种可能,分别用Mid1和Mid2表示。
1. 如果A[Low] < A[Mid],说明Mid落在区间1中,即图中Mid1的位置。那么,如果target小于A[Mid1],那么继续在Low和Mid1中间搜索;否则,在Mid1和High中间搜索;
2. 如果A[Low] >= A[Mid],说明Mid落在区间2中,即图中Mid2的位置。同理,如果target小于A[Mid2],那么继续在Low和Mid2中间搜索;否则,在Mid2和High中间搜索。
这样,平均地,我们每次剔除一半数据,时间复杂度是O(logn)。
1 class Solution { 2 public: 3 int findMin(vector<int>& nums) { 4 int size=nums.size()-1; 5 int l=0; 6 int r=size; 7 while(l<=r){ 8 int mid=l+(r-l)/2; 9 if(nums[mid]>nums[size]){ 10 l=mid+1; 11 }else{ 12 r=mid-1; 13 } 14 } 15 return nums[l]; 16 17 } 18 };
Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
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).
Find the minimum element.
The array may contain duplicates.
1 class Solution { 2 public: 3 int findMin(vector<int> &num) { 4 int low = 0; 5 int high = num.size()-1; 6 while(low < high) 7 { 8 if(num[low] < num[high]) 9 return num[low]; 10 11 int mid = low + (high-low)/2; 12 if(num[low] == num[mid]) 13 { 14 if(low+1 == high) 15 { 16 if(num[low]>num[high]) 17 low = high; 18 break; 19 } 20 else 21 low ++; 22 } 23 else if(num[low] < num[mid]) 24 low = mid; 25 else 26 high = mid; 27 } 28 return num[low]; 29 } 30 };