题目见书《剑指offer》82页,emmm,中间的几道题略过。
该题主要是考察另外一个思路,遍历整个数组找到最小数字固然简单,但是时间复杂度并不是所期待的。
编程思路:二分查找,抓住旋转数组的特点。
//面试题11:旋转数组的最小数字
#include<iostream>
using namespace std;
int Min(int* numbers, int length)
{
//判断边界条件
if (numbers == nullptr || length <= 0)
throw new exception("Invalid parameters");
int index1 = 0;
int index2 = length - 1;
int indexMid = index1;
while (numbers[index1] >= numbers[index2])
{
if (index2 - index1 == 1)
{
indexMid = index2;
break;
}
//二分查找
indexMid = (index1 + index2) / 2;
if (numbers[indexMid] >= numbers[index1])
index1 = indexMid;
else if (numbers[indexMid] <= numbers[index2])
index2 = indexMid;
}
return numbers[indexMid];
}
int main()
{
int numbers[] = { 4,5,6,2,3 };
int length = 5;
int min = Min(numbers, length);
cout << "旋转数组中的最小数字:" << min << endl;
system("pause");
return 0;
}
结果: