package jianzhioffer;
/**
*
* @author Dan
*题目描述:把一个数组最开始的若干个元素搬到数组的末尾
*我们称之为数组的旋转
*输入一个递增排序的数组的一个旋转
*输出旋转数组的最小元素
*例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
*
*解题思路:二分查找
*测试特殊样例:
*①数组是一个升序旋转数组,即就是将前0个数字搬到数组末尾,如1,2,3,4,5
*②数组中有重复数字如1,0,1,1,1
*③空数组
*/
public class MinInRotateArray {
public static void main(String[] args) {
test1();
test2();
test3();
test4();
test5();
test6();
}
private static int Min(int[] aa) {
if(aa==null||aa.length<=0){
System.out.println("Invalid Array");
throw new NullPointerException();
}
int index1=0;//第一个指针指向数组头
int index2=aa.length-1;//第二个指针指向数组尾
int indexMid=index1;
while(aa[index1]>=aa[index2]){//第一个数肯定大于等于最后一个数
if(index2-index1==1){//如果两个指针相邻了,则第二个指针指向的就是最小的数
indexMid=index2;
break;
}
indexMid=(index1+index2)/2;
//如果碰见1,0,1,1,1这种index1,index2,indexMid都相同,只能顺序查找
if(aa[index1]==aa[index2]&&aa[index1]==aa[indexMid]){
return MinInorder(aa);
}
//如果中间指针的值大于第一个值,如3,4,5,1,2,则中间指针肯定位于前面的递增数组,此时最小值在后面的递增数组中
if(aa[indexMid]>=aa[index1]){
index1=indexMid;
}else if(aa[indexMid]<=aa[index2]){//4,5,1,2,3
index2=indexMid;
}
}
return aa[indexMid];
}
//在数组中顺序查找最小值
private static int MinInorder(int[] aa) {
int min=aa[0];
for (int i = 0; i < aa.length; i++) {
if(min>aa[i]){
min=aa[i];
}
}
return min;
}
private static void test3() {//回旋数组1
int[] aa={3,4,5,6,1,2};
System.out.println(Min(aa));
}
private static void test2() {//回旋数组2
int[] aa={5,6,1,2,3,4};
System.out.println(Min(aa));
}
private static void test1() {//测试重复数字
int[] aa={1,1,1,0,1,1,1};
System.out.println(Min(aa));
}
private static void test5() {//测试首尾中都相同
int[] aa={1,1,1,0,1};
System.out.println(Min(aa));
}
private static void test4() {//测试顺序
int[] aa={1,2,3,4,5,6};
System.out.println(Min(aa));
}
private static void test6() {//测空
int[] aa=null;
System.out.println(Min(aa));
}
}
运行结果:
0
1
1
1
0
Exception in thread “main” Invalid Array
java.lang.NullPointerException
at jianzhioffer.MinInRotateArray.Min(MinInRotateArray.java:30)
at jianzhioffer.MinInRotateArray.test6(MinInRotateArray.java:87)
at jianzhioffer.MinInRotateArray.main(MinInRotateArray.java:24)