分析:
旋转后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子
数组的元素。最小的元素刚好是这两个子数组的分界线。
当数组中不含重复元素时:
当数组中含有重复元素时,无法移动两个指针来缩小查找范围:
public int minNumberInRotateArray(int[] array)
{
// 先对数组array的情况进行判断
if (array == null || array.length == 0)
{
return 0;
}
int left = 0;
int right = array.length - 1;
int mid = left; // 数组中第一个数字就是最小的数字
while (array[left] >= array[right])
{
// 当left指针和right指针相邻时
if (right - left == 1)
{
mid = right;
break;
}
mid = (left + right) / 2;
// 如果下标为left、right和mid指向的三个数字相等,
// 则只能顺序查找
if (array[left] == array[right] && array[mid] == array[left])
return minInOrder(array, left, right);
if (array[mid] >= array[left])
{
left = mid;
}
else if (array[mid] <= array[right])
{
right = mid;
}
}
return array[mid];
}
int minInOrder(int[] numbers, int left, int right)
{
int result = numbers[left];
for (int i=left+1; i<=right; i++)
{
if (result > numbers[i])
result = numbers[i];
}
return result;
}