已知一个递增排序的数组(可能有重复数字)在某处经过旋转,如{1,2,3,4,5}的一个旋转数组为{3,4,5,1,2},求旋转数组的最小值
解题思路:(1)第一个指针总是指向前面的递增数组,最终停在最大的元素上,即元素5,若与下一个元素相等则指向下一个元素;
(2)第二个指针总是指向后面的递增数组,最终停在最小的元素上,即元素1,若与下一个元素相等则指向下一个元素
int findMin(int* nums, int numsSize) {
if (nums == NULL || numsSize == 0)
return NULL;
else if (numsSize == 1)
return nums[0];
int start = 0;
int end = numsSize-1;
int middle = (start+end)/2;
//若数组未经过旋转
if (nums[start] < nums[end])
return nums[start];
while (start < end)
{
if (end-start == 1)
{
return nums[end];
}
//遇到重复数字时的处理方法
if (nums[start] == nums[start+1])
start++;
if (nums[end] == nums[end-1])
end--;
middle = (start+end)/2;
if (nums[middle] > nums[start])
{
start = middle;
}
else if (nums[middle] < nums[end])
{
end = middle;
}
}
return nums[middle];
}