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 };

 

posted on 2015-04-19 21:21  黄瓜小肥皂  阅读(155)  评论(0编辑  收藏  举报