二分之局部最小

简介: 二分之局部最小

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

先来看什么是局部最小,假设数组长度是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));
    }
}

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

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

相关文章
|
1月前
|
算法 测试技术 C#
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
|
3月前
|
算法 机器人 测试技术
【动态规划】【前缀和】【推荐】2463. 最小移动总距离
【动态规划】【前缀和】【推荐】2463. 最小移动总距离
|
5天前
|
算法 测试技术 C++
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
|
5天前
|
算法 测试技术 C#
【线段树 区间位运算模板】3117划分数组得到最小的值之和
【线段树 区间位运算模板】3117划分数组得到最小的值之和
|
1月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
3月前
|
算法 测试技术 C++
【动态规划】【C++算法】801. 使序列递增的最小交换次数
【动态规划】【C++算法】801. 使序列递增的最小交换次数
|
4月前
leetcode-775:全局倒置与局部倒置
leetcode-775:全局倒置与局部倒置
18 1
|
5月前
|
机器学习/深度学习 算法 测试技术
C++二分算法: 找出第 K 小的数对距离
C++二分算法: 找出第 K 小的数对距离
|
5月前
|
算法 测试技术 C++
C++二分算法:找到最接近目标值的函数值(一)
C++二分算法:找到最接近目标值的函数值
|
5月前
|
算法 C# C++
C++二分算法:找到最接近目标值的函数值(二)
C++二分算法:找到最接近目标值的函数值