题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
方法一:打擂法
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for(int i =0;i<n;i++){
arr[i] = input.nextInt();
}
int min = Integer.MAX_VALUE;
for(int i =0 ;i<n;i++){
min = Math.min(arr[i],min);
}
System.out.println(min);
}
}
方法二:因为题目告诉我们数据是递增排序的数组的一个旋转 所以我们可以尝试使用二分查找的策略 最小值一定在无序部分 用二分将有序的部分去除掉 如果数据重复出现例如 3 3 3 3 3 左边右边都是有序的就只能将r不断缩小 就退化成了O(n)了
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for(int i =0;i<n;i++){
arr[i] = input.nextInt();
}
int res = find(arr,0,arr.length-1);
System.out.println(res);
}
public static int find(int[] arr,int l,int r){
int mid = l+(r-l)/2;
// System.out.println(mid);
// for(int i =l ;i<=r;i++){
// System.out.print(arr[i]+" ");
// }
// System.out.println();
if(l>=r){
return arr[l];
}
if(arr[mid]<arr[r]){
return find(arr,l,mid);
}
else if(arr[mid]>arr[r]){
return find(arr,mid+1,r);
}
else{
return find(arr,l,r-1);
}
}
}