二分之局部最小

简介: 二分之局部最小

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

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

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

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

相关文章
|
运维 Ubuntu Java
如何在Linux中不解压就能查看压缩包中的内容,这13个命令非常强!
不解压查看压缩包内容对于提升 Linux 使用效率帮助非常大,不管是开发人员还是运维人员,这种需求场景非常多。
5831 0
如何在Linux中不解压就能查看压缩包中的内容,这13个命令非常强!
|
3天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1085 152
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1751 9
|
9天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
694 152
|
11天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
660 14
|
6天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
438 5