题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
递归方法:
class Solution {
public:
bool validInput=true;
int getNum(vector<int> arr,int i, int j)
{
if(i==j || i+1==j)
return arr[i]>arr[j]?arr[j]:arr[i];
int mid=(i+j)/2;
if(arr[i]==arr[mid] && arr[mid]==arr[j])
{
int find1=getNum(arr,i,mid);
int find2=getNum(arr,mid+1,j);
return find1>find2?find2:find1;
}
else if(arr[mid]>=arr[i] && arr[mid]>arr[j])
i=mid;
else
j=mid;
return getNum(arr,i,j);
}
int minNumberInRotateArray(vector<int> rotateArray) {
int len=rotateArray.size();
if(len<=0)
{
validInput=false;
return 0;
}
int i=0,j=len-1;
return getNum(rotateArray,0,len-1);
}
};
非递归方法:
int getMin(vector<int> arr,int i,int j)
{
int min=arr[i];
for(int k=i+1;k<=j;k++)
{
if(arr[k]<min)
min=arr[k];
}
return min;
}
int getNum(vector<int> arr, int i,int j)
{
int mid = 0;
while(arr[i]>=arr[j])
{
if(j-i==1) //若不加上这个条件,会出现死循环的哦!!!!!注意!!!!
return arr[i]>arr[j]?arr[j]:arr[i];
mid=(i+j)/2;
if(arr[i]==arr[mid] && arr[mid]==arr[j])
{
return getMin(arr,i,j);
}
else if(arr[i]<=arr[mid] && arr[mid]>arr[j]) //注意这个条件啊,很容易弄错的
i=mid;
else
j=mid;
}
return arr[mid];
}
int minNumberInRotateArray(vector<int> rotateArray) {
int len=rotateArray.size();
if(len<=0)
{
validInput=false;
return 0;
}
int i=0,j=len-1;
return getNum(rotateArray,0,len-1);
}