java 二分查找局部最大值

package Code01;

import java.util.Arrays;

public class CodePractice {

//    局部最小值问题   二分
//    数列无序  任意两个相邻的两个数不相等
//    返回一个局部最小值
    public static int oneMinIndex(int[] arr){
        if(arr == null || arr.length==0){
            return -1;
        }

        int N = arr.length;
        if(N == 1){
            return 0;
        }
        if(arr[0] < arr[1]){
            return 0;
        }
        if(arr[N-1] < arr[N-2]){
            return N-1;
        }

        int L = 0;
        int R = N-1;
        while (L < R-1) {
            int mid = (L+R)/2;
            if(arr[mid]< arr[mid-1] && arr[mid] < arr[mid+1]){
                return mid;
            }
            else if(arr[mid] > arr[mid-1]){
                R = mid-1;
            }
            else {
                L = mid+1;
            }
        }
        return arr[L] < arr[R] ? L : R;
    }

//    验证是否为局部最小
    public static boolean test(int[] arr, int minIndex){
        if(arr.length==0){
            return minIndex == -1;
        }
        int left = minIndex-1;
        int right = minIndex+1;
        boolean leftBigger = left >= 0 ? arr[left] > arr[minIndex] : true;
        boolean rightBigger = right < arr.length ? arr[right] > arr[minIndex] : true;
        return leftBigger && rightBigger;
    }

//    生成随机数组且相邻数不相等
    public static int[] randomArray(int maxLen, int maxValue){
        int len = (int)(Math.random()*maxLen);
        int[] arr = new int[len];

        if(len > 0){
            arr[0] = (int)(Math.random()*maxValue);
            for(int i=1;i<len;i++){
                do{
                    arr[i] = (int)(Math.random()*maxValue);
                }while (arr[i] == arr[i-1]);
            }
        }
        return  arr;
    }

    public static void print(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args){
        int maxLen = 50;
        int maxValue = 200;
        int testTimes = 10000;

        System.out.println("测试开始");
        for(int i=0;i<testTimes;i++){
            int[] arr = randomArray(maxLen, maxValue);
            int ans = oneMinIndex(arr);
            if(!test(arr, ans)){
                print(arr);
                System.out.println(ans);
                break;
            }
        }
        System.out.println("测试结束");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值