把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
思路
/**
* 旋转数组的最小值
* 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
* 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
* 例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
*
* 使用二分法 查找
* 旋转有序的数组会得到一个 分为 两部分有序的数组 。
*
* 使用二分,当中间元素的值大于右边界值则说明 最小元素在右边界,
* 则 把左界更新到mid + 1 位置,继续二分直到找到最后一个。
* 当中间的值小于右界,这说明最小值在左边。继续二分。
* 当出现中间值等于右界的情况则把右界向左移动一个位置继续判断。直到出现上面两种情况
*
*
*时间复杂度o(log n)二分查找的时间复杂度是o(log n) 最坏情况:都是相同的元素则右界会从最后一个元素移动到第一个位置
* 则时间复杂度是o(n)
*
* 空间复杂度: o(1) 没有使用到额外的空间
*
*
*/
代码
public int minArray(int[] arr) {
int l = 0;
int r = arr.length - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (arr[mid] < arr[r]) {
r = mid;
} else if (arr[mid] > arr[r]) {
l = mid + 1;
} else {
r--;
}
}
return arr[l];
}