题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组中最小的元素。例如:数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小元素为 1 。
使用两个指针,一个指向数组的开始,一个指向数组的末尾,那么一般情况下(存在特例)数组的首元素 会 大于数组的末尾元素。当 中间元素 大于 数组首元素 时,中间元素肯定在前面的递增序列中,当 中间元素 小于数组末尾元素时,中间元素肯定在后面的递增序列中。这样的话,我们就可以缩小查找的范围。
#include <iostream>
using namespace std;
int MyMin(int a[], int length)
{
int start = 0;
int middle = start;
int end = length - 1;
while(a[start] >= a[end])
{
if(end - start == 1)
{
middle = end;
break;
}
middle = (end + start) / 2;
if(a[middle] >= a[start])
start = middle;
else if(a[end] >= a[middle])
end = middle;
}
return middle;
}
int main()
{
int a[] = {4,5,6,7,8,1,2,3};
int length = sizeof(a) / sizeof(a[0]);
int Min = MyMin(a, length);
cout << "最小的是:" << a[Min] << endl;
return 0;
}