旋转数组的最小数字:
求解方法类似于二分查找法,因为输入的是递增排序的数组的一个旋转,因此最小元素刚好为两个子数组的分界线
//旋转数组里面最小的数字
int MinOrder(int* data, int length)
{
int min = 0;
for (int i = 0; i < length; i++)
{
if (data[i] < min)
{
min = data[i];
}
}
return min;
}
int Min(int* data, int length)
{
if (data == nullptr || length < 0)
{
throw new std::exception("input error.");
}
int start = 0;
int end = length - 1;
int mid = start;
while (data[start]>=data[end])//如果旋转后的第一个数小于最后一个数说明没有进行反转,直接返回第一个数即可
{
if (start == end - 1)
{
return data[mid];
}
mid = start+(end - start) / 2;
if (data[start] == data[end] == data[mid])//考虑到无法解决的情况 data[] = { 2,2,2,1,2 } ,调用常规方法来解决
return MinOrder( data, length);
if (data[mid] > data[start])//如果中间元素大于第一个元素,说明最小元素在中间元素的后面
{
start = mid;
}
else //反之最小元素在中间元素的左面
{
end = mid;
}
}
return data[mid];
}