您的位置:首页 > 职场人生

剑指offer 面试题8

2015-06-26 14:45 393 查看
题目:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数列的一个旋转,输出旋转数组的最小元素。例如数组{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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: