剑指Offer(Java版)第十题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

/*
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
*/
public class Class10 {
//因为是一个递增数列的旋转,判断出高低的一个变化位置非常重要
//可以使用二分法来实现这一过程
//如果不考虑其他使用简单的排序方法来直接获得最小值也不错。
public int sortAndFindMin(int[] a){
int index_low = 0;
int index_high = a.length - 1;
if(a.length < 0){
throw new RuntimeException("数组错误!");
}
if(a.length == 0 || a == null){
throw new RuntimeException("数组为空!");
}
if(a.length == 1){
return a[index_low];
}
while(index_low < index_high){
int index_mid = index_low + (index_high - index_low)/2;
if(a[index_mid] < a[index_high]){
index_high = index_mid;
}
if(a[index_mid] > a[index_high]){
index_low = index_mid + 1;
}
if(a[index_mid] == a[index_high]){
index_high--;
}
}
return a[index_low];
}

public void test(){
int[] a = {3, 4, 5, 1, 2};
System.out.println(sortAndFindMin(a));
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Class10 c = new Class10();
c.test();
}
}

原文地址:https://www.cnblogs.com/zhuozige/p/12421515.html