题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:
考察对数组的查找方法:
- 从头到尾遍历数组:时间复杂度O(n)
- 二分查找:时间复杂度O(logn)
程序:
程序1:
//常规方法:从头到尾遍历数组
import java.util.Scanner;
public class subject6 {
public static int minNumberInRotateArray(int[] array) {
if(array.length == 0){
return 0;
}
int min = array[0];
for(int i = 0; i < array.length; i ++){
if(array[i] < min){
min = array[i];
}
}
return min;
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String str = sc.next();
int[] a = new int[str.length()];
for(int i = 0; i < str.length(); i ++){
a[i] = Character.getNumericValue(str.charAt(i));
}
System.out.println(minNumberInRotateArray(a));
}
}
程序2:
//二分查找法
import java.util.Scanner;
public class subject6 {
public static int minNumberInRotateArray(int[] array) {
if(array.length == 0){
return 0;
}
int minIndex = 0;
int top = 0;
int tail = array.length - 1;
while(array[top] >= array[tail]){
if(tail - top == 1){
minIndex = tail;
break;
}
minIndex = (top + tail) / 2;
if (array[minIndex] >= array[top]) {
top = minIndex;
} else if (array[minIndex] <= array[tail]) {
tail = minIndex;
}
}
return array[minIndex];
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String str = sc.next();
int[] a = new int[str.length()];
for(int i = 0; i < str.length(); i ++){
a[i] = Character.getNumericValue(str.charAt(i));
}
System.out.println(minNumberInRotateArray(a));
}
}