二分之局部最小

简介: 二分之局部最小

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

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

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

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

相关文章
|
2月前
|
机器学习/深度学习 自然语言处理 搜索推荐
大模型应用:规则引擎 + 千问大模型:确定性骨架与智慧大脑的新融合实践.89
本文探讨“规则引擎+大模型”协同架构:规则引擎(如Drools、rule-engine)作为确定性骨架,保障合规、可解释、零幻觉;大模型则充当柔性大脑,提升自然语言理解、推理与交互能力。二者互补而非替代,是智能系统落地的最佳实践路径。
443 2
|
2月前
|
存储 安全 数据可视化
《QClaw自定义的黄金三角法则》
本文针对多数QClaw用户依赖默认Agent、反复调整提示词却效果不佳的普遍痛点,基于两个月的深度实践,拆解了自定义Agent的完整底层逻辑。文章跳出表面的语气设置,深入阐述了人设构建(具体行为规则+静态记忆配置)、专长打造(垂直分工+工具精准匹配+私有知识库导入)、权限管理(三级权限体系+网络白名单控制)三大核心环节的实操方法,同时分享了Agent训练优化技巧与多Agent协同的实战经验。文章指出,自定义Agent不仅能大幅提升工作效率,更是一个自我反思与认知的过程,最终能打造出真正懂你的专属数字分身。
349 0
|
4月前
|
人工智能 自然语言处理 安全
Gemini:2026年最强AI模型之一,如何在实际应用中挑战GPT与Claude的地位?
2026年,大模型竞争正从“谁更强”转向“谁更稳、更适配工程”。Gemini凭借推理结构一致性、长上下文稳定性及多模型协同友好性,成为生产系统关键选项,推动AI架构向“可调度的模型能力”演进。
|
6月前
|
存储 弹性计算 容灾
高可用架构设计:多可用区部署策略
本文详解阿里云多可用区高可用架构设计,涵盖计算、数据、网络层冗余部署与故障转移方案,结合容灾演练与成本优化策略,以电商系统为例提供多AZ实践指南,助力企业构建稳定、高效的业务连续性体系。
513 0
|
10月前
|
存储 小程序 索引
Python变量与基础数据类型:整型、浮点型和字符串操作全解析
在Python编程中,变量和数据类型是构建程序的基础。本文介绍了三种基本数据类型:整型(int)、浮点型(float)和字符串(str),以及它们在变量中的使用方式和常见操作。通过理解变量的动态特性、数据类型的转换与运算规则,初学者可以更高效地编写清晰、简洁的Python代码,为后续学习打下坚实基础。
1168 0
|
C语言
C语言中的条件运算符和条件表达式详解
C语言中的条件运算符和条件表达式详解
2133 0
|
存储 网络协议 网络性能优化
网络传输延迟
网络传输延迟
1104 1
|
存储 Java
|
Java 程序员
谈谈程序员如何学习新技术
文章分享了作者学习新技术的经验和方法,从确定学习目标、制定学习计划到学中坚持和学后应用,强调了持续学习的重要性,并鼓励程序员通过实践、写作、分享和开源贡献等方式不断成长和提升技术能力。
|
存储 安全 Java
从基础到实战:如何用 Java 手写一个阻塞队列?
大家好,我是小米!今天分享手写阻塞队列(Blocking Queue)教程,深入讲解并发编程中的 wait() 和 notifyAll() 机制,通过代码实战,让你轻松掌握生产者-消费者模型中的阻塞队列实现!
536 0