#include<iostream>
#include<stdio.h>
using namespace std;
int MinInorder(int* numbers, int index1, int index2)
{
int min = numbers[index1];
int t;
for (int i = index1; i < index2 + 1; i++)
{
if (min>numbers[i])
{
t = min;
min = numbers[i];
numbers[i] = t;
}
}
return min;
}
int Min(int* numbers, int length)
{
if (numbers == NULL || length <= 0)
{
throw new std::exception("Invalid,parameters");
}
int index1 = 0;//记录数组的最左端
int index2 = length;//记录数组的最右端
int indexMid = index1;//记录旋转数组的中间值
while (numbers[index1]>=numbers[index2])
{
if (index2 - index1 == 1)
{
indexMid = index2;
break;
}
indexMid = (index1 + index2) / 2;
if (numbers[index1] == numbers[indexMid] && numbers[index2] == numbers[indexMid])
{
return MinInorder(numbers, index1, index2);
}
if (numbers[indexMid] >= numbers[index1])
{
index1 = indexMid;
}
else if (numbers[indexMid] <= numbers[index2])
{
index2 = indexMid;
}
}
return numbers[indexMid];
}
int main()
{
int v[] = { 1,0,1,1,1,1 };
int length = sizeof(v) / sizeof(v[0]) - 1;
cout << Min(v, length) << endl;;
return 0;
}
剑指offor面试题8:旋转数组的最小数字
最新推荐文章于 2024-04-25 07:07:39 发布