题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{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; }
原文:http://blog.csdn.net/buyingfei8888/article/details/38390019