二分之局部最小

简介: 二分之局部最小

在一个无序数组中,任意相邻两数不等,求一个局部最小值?

先来看什么是局部最小,假设数组长度是N

  • 0位置的数比1位置的数小,0位置的数就是局部最小
  • N-1位置的数比N-2位置的数小,N-1位置的数就是局部最小
  • 任何一个中间的位置i,既要比i-1位置的数小,又要比i+1位置的数小,i位置的数才是局部最小
package com.harrison.class01;

/**
 * @author Harrison
 * @create 2022-01-21-21:06
 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
 */
public class Code07_BSAwesome {
    public static int getLocalLessIndex(int[] arr){
        if(arr==null || arr.length==0){
            return -1;
        }
        if(arr.length==1 || arr[0]<arr[1]){
            return 0;
        }
        if(arr[arr.length-1]<arr[arr.length-2]){
            return arr.length-1;
        }
        int L=1;
        int R=arr.length-2;
        int mid=0;
        while(L<R){
            mid=L+((R-L)>>1);
            if(arr[mid]>arr[mid-1]){
                R=mid-1;
            }else if(arr[mid]>arr[mid+1]){
                L=mid+1;
            }else{
                return mid;
            }
        }
        return L;
    }

    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1))-(int) (Math.random() * maxValue);
        }
        return arr;
    }

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

    public static void main(String[] args) {
        int[] arr=generateRandomArray(20,20);
        printArray(arr);
        System.out.println(getLocalLessIndex(arr));
    }
}

**所以,二分的问题不一定要求数据有序才能进行,而是要看数据状况是怎样的,
(数据状况特殊 || 问题定义很奇葩) 只要能够构建出一种排他性就可以有效利用二分。**

更多二分系列文章,请看下面博客:

相关文章
|
6月前
|
算法 测试技术 C#
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
|
6月前
|
算法 测试技术 C#
【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
|
6月前
|
算法 机器人 测试技术
【动态规划】【前缀和】【推荐】2463. 最小移动总距离
【动态规划】【前缀和】【推荐】2463. 最小移动总距离
|
6月前
|
人工智能 移动开发 算法
【动态规划】【C++算法】LeetCoce996正方形数组的数目
【动态规划】【C++算法】LeetCoce996正方形数组的数目
|
3月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
6月前
|
机器学习/深度学习 算法 测试技术
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
|
6月前
|
算法 测试技术 C++
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
|
6月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
6月前
|
算法 测试技术 C++
【动态规划】【C++算法】801. 使序列递增的最小交换次数
【动态规划】【C++算法】801. 使序列递增的最小交换次数
|
11月前
|
机器学习/深度学习 算法 测试技术
C++二分算法: 找出第 K 小的数对距离
C++二分算法: 找出第 K 小的数对距离