问题描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,属于[3, 4, 5, 1, 2]为[1, 2, 3, 4, 5]的一个旋转,该数组的最小值为1。
思路
使用二分法查找即可。虽然经过旋转以后,整个数组并不是整个有序,但是分成两段,每段都是有序的。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] temp = scanner.nextLine().trim().split(" ");
int[] arr = new int[temp.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(temp[i]);
}
System.out.println(minArray(arr));
}
public static int minArray(int[] numbers) {
int left = 0;
int right = numbers.length - 1;
int mid = left + (right - left) / 2;
while (left < right) {
if (numbers[mid] > numbers[right]) {
left = mid + 1;
} else if (numbers[mid] < numbers[right]) {
right = mid;
} else {
right--;
}
mid = left + (right - left) / 2;
}
return numbers[left];
}
}