剑指offer 面试题8
题目:
把一个数组最開始的若干个元素搬到数组的末尾。我们称之为数组的旋转。输入一个递增排序的数列的一个旋转。输出旋转数组的最小元素。比如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
解释一下:
就是比方输入数组{3,4,5,1,2},要求输出数字1.要求时间复杂度小于O(n)。
本题有一个陷阱。就是怎样处理{1,1,1,1,1,0,1,1,1,1}这样的序列。
#include<iostream>
using namespace std;
int MinInOrder(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)
exception("Invalid Value!");
int index1 = 0, index2 = length - 1;
int 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 MinInOrder(data,index1,index2);
if (data[indexMid] >= data[index1])
index1 = indexMid;
else if (data[indexMid] <= data[index2])
index2 = indexMid;
}
return data[indexMid];
}
int main()
{
int data[] = { 1, 1, 1, 1,0, 1 };
cout<<Min(data,6);
return 0;
}