把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。 例如数组 { 3,4,5,1,2 } 为{ 1,2,3,4,5 }的一个旋转, 该数组的最小值为1。
code:
int Min(int* numbers, int length)
{
if (numbers == NULL || length < 0)
{
throw invalid_argument("Invalid parameters");
}
int low = 0;
int high = length - 1;
int mid = 0; //如果是原序列
while (numbers[low] >= numbers[high])
{
// 如果index1和index2指向相邻的两个数,
// 则index1指向第一个递增子数组的最后一个数字,
// index2指向第二个子数组的第一个数字,也就是数组中的最小数字
if (high - low == 1)
{
mid = high;
break;
}
mid = (low + high) / 2;
// 如果下标为index1、index2和indexMid指向的三个数字相等,
// 则只能顺序查找
if (numbers[mid] == numbers[low] && numbers[mid] == numbers[high])
{
numbers[mid] = MinInOrder(numbers, low, high);
break;
}
if (numbers[mid] >= numbers[low])
low = mid;
else if(numbers[mid] <= numbers[high])
{
high = mid;
}
}
return numbers[mid];
}
int MinInOrder(int* numbers, int low, int high)
{
int result = numbers[0];
for (int i = low+1; i <= high; i++)
{
if (numbers[i] < result)
{
result = numbers[i];
}
}
return result;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-13 00:30:43