输入的数组对于有序数组input在某个pivot上进行了折叠....即以pivot为界,有序数组=AB,A,B都是有序的且B>A。。。。输入数组input=BA....
由于A和B内都是有序的且A[0]是我们应该返回的最小值。最初我的解法和思路就是遍历数组找到首先出现num[i]<num[i-1]的num[i]返回,这种做法代价是O(n)的。
public class Solution {
public int findMin(int[] num) {
int len = num.length;
for(int i=1;i<len;i++ )
{
if(num[i]<num[i-1])
{
return num[i];
}
}
return num[0];
}
}
看了解答之后发现原来还有O(lgn)的解法。即二分求解。
初始st=0,ed=len-1。。。判断M=(st+ed)/2处num的值和st,ed的值的关系....若num[ed]>num[st],说明本身这一段就是有序的,返回num[st]即可;否则若num[M]<num[ed],说明num[M]在A那段中,即最小值A[0]在st到M中;否则num[M]在B中,A[0]出现在M到ed中...这样我们就划分了新的二分查找区域,这种方法是O(lgn)的
public class Solution {
public int findMin(int[] num) {
int len = num.length;
return fun(0,len-1,num);
}
int fun(int st,int ed,int[] num)
{
if(ed==st)
{
return num[st];
}
if(ed-st==1)
{
return num[st]<num[ed]?num[st]:num[ed];
}
if(num[ed]>num[st])
{
return num[st];
}
int M = (st+ed)/2;
if(num[M]<num[ed])
{
return fun(st,M,num);
}
return fun(M,ed,num);
}
}