面试题8_旋转数组的最小值
//面试题8:旋转数组中的最小数
//给定一个旋转数组,求出其中的最小值。
//旋转数组的定义:把一个数组最开始的若干个元素搬到该数组的末尾。
//例如:输入一个递增排序的数组{1,2,3,4,5}的一个旋转数组是{3,4,5,1,2},
//其中最小数字是1。
#include<iostream>
#include<vector>
using namespace std;
bool g_InputInvalid=false;
class Solution
{
public:
int MinOrder(int num[], int p1, int p2)
{
int result=num[p1];
for(int i=p1+1; i<=p2; ++i)
{
if(num[i]<result)
result=num[i];
}
return result;
}
int FindMin(int num[], int length)
{
if(num==nullptr || length<=0)
{
g_InputInvalid=true;
return 0;
}
//使用二分查找
int p1=0;
int p2=length-1;
int indexmin=p1;
while(num[p1]>=num[p2])
{
if(p2-p1 == 1)
{
indexmin=p2;
break;
}
indexmin=(p1+p2)/2;
if(num[p1]==num[indexmin] && num[p2]==num[indexmin])
return MinOrder(num,p1,p2);
else if(num[indexmin]>=num[p1])
p1=indexmin;
else if(num[indexmin]<num[p2])
p2=indexmin;
}
return num[indexmin];
}
};
int main(void)
{
int num[]={3,4,5,1,2};
//int num[]={1,1,1,1,1};
//int num[]={1,2,3,4,5};
//int num[]={1,0,1,1,1};
//int num[]={1,1,1,0,1};
Solution object;
int minnumber=object.FindMin(num,5);
cout<<minnumber<<endl;
system("pause");
return 0;
}