一、原题:
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.
二、分析:
数组的输入顺序可能有两种情况,第一种是数组全部是有序的(i.e. 0,1,2,3,4);另一种是数组是经过旋转的(rotated)(i.e.2,3,4,0,1)。因此,首先比较a[0]与a[a.length-1],若a[0]<a[a.length-1],则数组是有序的,最小值就是a[0]。
如果数组是经过旋转的,则选取数组的中点(a[mid])与数组两端(a[start]、a[end])的值相比较。a[mid]只可能同时大于或小于a[start]/a[end].
(1)若a[mid]>a[start],则说明最小值在a[mid..end]中;
(2)若a[mid]<a[end],则最小值在a[start..mid]中;
递归求解第二种情况。这里要注意递归的终止条件,当(a[start]<=a[end])||(start>=end)时,递归终止,既当递归的字数组出现全部有序的时候终止。
三、代码:
public class Solution {
public int findMin(int a[]){
if(a[0]<a[a.length-1])
return a[0];
return a[findRecursive(0,a.length-1,a)];
}
private int findRecursive(int start,int end,int[] a){
if((start>=end)||(a[start]<=a[end]))
return start;
int mid=(start+end)/2;
if(a[mid]<a[start])
mid= findRecursive(start,mid,a);
else
mid =findRecursive(mid+1,end,a);
return mid;
}
}
算法的时间复杂度是O(lgN)。