把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
可以使用暴力遍历的方式,也可以使用二分法查找
class Solution {
public int minArray(int[] numbers) {
int s = 0;
int e = numbers.length - 1;
int mid = s;
while(numbers[s] >= numbers[e]) {
if (e - s == 1) {
mid = e;
break;
}
mid = (s + e) / 2;
// 有一种情况使得无法判断出最小的数字在那个区间,如 [10,1,10,10,10]
if (numbers[s] == numbers[mid] && numbers[e] == numbers[mid]) {
return min(numbers, s, e);
}
if (numbers[s] <= numbers[mid]) {
s = mid;
} else if (numbers[mid] <= numbers[e]) {
e = mid;
}
}
return numbers[mid];
}
private int min(int[] numbers, int s, int e) {
int res = numbers[s];
for (int i = s + 1; i <= e; i++) {
if (numbers[i] < res) {
res = numbers[i];
}
}
return res;
}
}
网友评论