题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
解法:
- 顺序查找即可,时间复杂度为
- 利用二分查找的思想,大部分情况旋转后数组最小值左边数值为最大,利用前后指针的方法找到最小值,此部分时间复杂度为
;当数组旋转左侧的0个数或者数组中有相同元素时,退化为第1种解法。
public int minArray(int[] numbers) {
int low = 0, high = numbers.length - 1;
while (low < high) {
int mid = (low + high) / 2;
if (numbers[mid] > numbers[high])
low = mid + 1;
else if (numbers[mid] < numbers[high])
high = mid;
else
high--;
}
return numbers[low];
}