题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1。
可以使用从头到尾遍历,时间复杂度为O(n),根据其特性可以使用二分查找,降低时间复杂度。
代码:
#include <iostream>
using namespace std;
int secMin(int *data,int index1,int index2){
int result = data[index1];
for(int i= index1 + 1;i <= index2;i++){
if(result > data[i])
result = data[i];
}
return result;
}
int min(int *data,int length){
if(NULL == data || length < 0)
throw exception("invalid input");
//将indexMid初始化为index1 当index1 本身就是最小数字,直接就可以返回
int index1 = 0,index2 = length - 1, indexMid = index1;
while(data[index1] >= data[index2]){
if(index2 - index1 == 1){
indexMid = index2;
break;
}
indexMid = (index1 + index2) / 2;
if(data[index1] == data[index2] && data[index1] == data[indexMid]){
return secMin(data,index1,index2);
}
if(data[indexMid] >= data[index2]){
index1 = indexMid ;
}else{
index2 = indexMid ;
}
}
return data[indexMid];
}
int main()
{
int data[]={1,0,1,1,1};
cout<<min(data,sizeof(data) / sizeof(int));
return 0;
}
运行结果: