回旋数组中查找最小数字

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值