二分查找算法【包括数组全局有序和局部有序的介绍,以及求局部最小值】

news2024/11/25 7:11:48

二分查找算法

二分查找要点:有序,但是一定全局有序吗?==> 不一定需要全局有序

全局有序概念

一个有序的数组,通过找到 L 和 R 的中点值 ,与目标值比较,来排除一半错误的信息

时间负责度计算

32 16 8 4 2 1 时间负责度 为 log 2 N

对于每一次 减半的操作 为 O(1)

所以最终时间负责度为 O( log 2 N)

img

局部有序概念

需要特殊的数据情况,如果能够构建一种排他性的东西 ,左右两侧只要有一半一定有你需要的,如果找到了,直接砍一半就可以了,所以数据特殊的情况,同时满足这类排他性情况,也可以二分

找出某个数

public static Integer getNumForHalf(int[] arr, int num) {
    int N = arr.length - 1;
    int L = 0;
    int R = arr.length - 1;
    while (L <= R) {
        int mid = L + ((R - L) >> 1);
        if ( arr[mid] == num){
            return mid;
        } else if(arr[mid] < num){
            L = mid + 1;
        }else {
            R = mid - 1;
        }
    }
    return null;
}

有序数组查找的数在最左的位置

在已经找到某个数的基础上 依次向左寻找,并记录index,直到值不是目标数为止,找出最右位置同理

public static Integer getNumForHalfLeft(int[] arr, int num) {
    int N = arr.length - 1;
    int L = 0;
    int R = arr.length - 1;
    int indexLeft = -1;
    while (L <= R) {
        int mid = L + ((R - L) >> 1);
        if ( arr[mid] == num){
            indexLeft = mid;
            mid --;
            while (arr[mid] == num){
                indexLeft = mid;
                mid--;
            }
            break;
        } else if(arr[mid] < num){
            L = mid + 1;
        }else {
            R = mid - 1;
        }
    }
    return indexLeft != -1 ? indexLeft : null;
}

局部最小值问题

在一个无序数组中, 值有可能正, 负, 或者零, 数组中任由两个相邻的数一定不相等.
定义局部最小:
1.长度为1,arr[0]就是局部最小;
2.数组的开头,如果arr[0] < arr[1] ,arr[0]被定义为局部最小。
3.数组的结尾,如果arr[N-1] < arr[N-2] ,arr[N-1]被定义为局部最小。
任何一个中间位置i, 即数组下标1~N-2之间, 必须满足arr[i-1] > arr[i] <arr[i+1] ,叫找到一个局部最小。
请找到任意一个局部最小并返回。

思路

以下图为例

1,如果 同时不满足 arr[0] < arr[1] 和 arr[N-1] < arr[N-2] 那么两边形成的曲线如图

2,此时如果有局部最小,必须满足 在 数组下标1~N-2之间, arr[i-1] < arr[i] <arr[i+1] (即 5 7 5 或 10 3 5 的曲线 ),通过曲线可以看出 先下降后上升,所以形成这样的曲线一定会有一个转折点 比左边小,也比右边小,例如数字 3 ,否则不能形成这样的曲线

3,此时就可以判断

3.1 , 如果arr[mid-1] > arr[mid] < arr[mid+ 1] 直接返回即可 (如果不满足,最少有一侧式大于mid的)

3.2, 如果arr[mid- 1 ] < arr[mid] 那么 说明 从 mid - 1到 mid的曲线是上升的 ,L 到 mid 重新可以构成先下降后上升的曲线 如图红线框选区域, 所以从L 到 mid 上一定存在局部最小。

3.3,如果arr[mid] > arr[mid + 1] 那么 说明 从 mid 到 mid + 1的曲线是下降的 ,mid 到 R 重新可以构成先下降后上升的曲线 如图绿色框选区域, 所以从mid 到 R 上一定存在局部最小。

img

public static Integer getNumForHalf(int[] arr) {
    if (arr == null || arr.length == 0){
        return null;
    }

    // 只有 1 个数字  或者 0 < 1
    if(arr.length == 1 || arr[0] < arr[1]){
        return 0;
    }
    if(arr[arr.length - 1 ] < arr[arr.length - 2]){
        return arr.length - 1;
    }

    // 因为 mid 要判断 mid + 1和 -1 所以从 1 和 arr.length - 2 开始
    int L = 1;
    int R = arr.length - 2;
    while (L <= R) {
        int mid = L + ((R - L) >> 1);
        if (arr[mid - 1] > arr[mid] && arr[mid] < arr[mid + 1]){
            return mid;
        } else if (arr[mid - 1] < arr[mid]){
            R = mid + 1;
        } else if (arr[mid] > arr[mid + 1]){
            L = mid - 1;
        }
    }
    return null;
}

都看到着了,点个赞呗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round #787 (Div. 3) F. Vlad and Unfinished Business

翻译&#xff1a; Vlad和Nastya住在一个由&#x1d45b;房子和&#x1d45b;−1路组成的城市。从每一个房子&#xff0c;你只需要沿着路走就可以到达另一个。也就是说&#xff0c;城市是一棵树。 弗拉德住在索引为&#x1d465;的房子里&#xff0c;娜斯提亚住在索引为&#…

[附源码]Python计算机毕业设计SSM交通事故记录信息管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

「Redis数据结构」字符串对象String

「Redis数据结构」字符串对象String 文章目录「Redis数据结构」字符串对象String一、概述二、编码分类intembstrrow三、小结四、参考一、概述 字符串数据类型是Redis里最常用的类型&#xff0c;它的键和值都是字符串&#xff0c;使用起来非常的方便。虽然字符串数据类型的值都…

BUG系列路径规划算法原理介绍(一)——总结篇

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

【论文合集】2022年11月医学影像期刊论文合集

★ 本月IEEE Transactions on Medical Imaging(1区 top if 11.037) 共41篇, Medical Image Analysis&#xff08;1区 top if 13.828&#xff09; 共47篇. ”标题高频词汇 (segmentation, 15), (medical, 13), (3d, 6), (domain, 6), (surgical, 5), (reconstruction, 5), (at…

confluence的几个高危漏洞复现

序言 本次复现涉及了好几个confluence的相关漏洞&#xff0c;从复现利用到提权&#xff0c;有兴趣的可以自行搭建环境测试。 1.CVE-2021-26084 Confluence OGNL 注入漏洞 1.1 漏洞描述 在某些情况下&#xff0c;远程攻击者在经过身份验证或在特定环境下未经身份验证的情况下…

【MySQL】表的增删改查(二)

你可以了解世间万物&#xff0c;但追根溯源的唯一途径便是亲身尝试。——《心灵捕手》 前言&#xff1a; 大家好&#xff0c;上期我们讲到了表的GRUD操作中的新增数据、查询数据以及表中数据的排序、去重等操作&#xff0c;本期讲解条件查询、修改数据、删除数据的简单操作&…

Jlink_V9固件修复教程

最近自己的Jlink坏了&#xff0c;于是找了一个好的Jlink给坏的重新刷了一下固件就修好了。记录一下修复过程&#xff0c;以及遇到的问题。 故障现象&#xff1a;Jlink丢失固件之后指示灯不亮&#xff0c;连接板子时&#xff0c;KEIL无法识别。 注&#xff1a;JLINK_V9主控芯…

【Vue】从vue2到vue3,生命周期函数有何变化之详解

vue2与vue3生命周期的对比&#xff1a; Vue2--------------Vue3 beforeCreate—————–>setup() created————————>setup() beforeMount—————–>onBeforeMount mounted—————-------> onMounted beforeUpdate -————–> onBeforeUpdate u…

Spring Boot自动配置原理(Spring Boot面试题)

目录 1、产生疑惑 2、源码分析 2.1、pom.xml文件分析 2.2、启动类分析 3、总结 1、产生疑惑 当我们第一次使用Spring Boot练习的时候会觉得Spring Boot这么厉害&#xff0c;不管是依赖还是配置&#xff0c;它都为我们准备好了&#xff0c;我们只需要去编写业务代码就可…

[附源码]Python计算机毕业设计Django数字乡村基础治理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

调优四剑客的实战演练,福尔摩斯•K带你轻松优化性能

前言天下武功&#xff0c;唯快不破。在侦探的世界中&#xff0c;破案效率永远是衡量一名侦探能力的不二法门。作为推理界冉冉升起的新星&#xff0c;大侦探福尔摩斯K凭借着冷静的头脑、严谨的思维&#xff0c;为我们展现了一场场华丽而热血的推理盛宴。接下来&#xff0c;我们不…

【运维面试题】访问www.baidu.com背后发生了什么·dns解析过程·ping过程

文章目录 一、访问www.baidu.com背后发生了什么二、dns解析过程答法1(推荐)答法2三、ping过程一、访问www.baidu.com背后发生了什么 1.浏览器解析url是否合法 2.浏览器向DNS服务器请求解析ip地址 3.dns将解析出来的ip地址返回给浏览器 4.三次握手,浏览器与服务器进行tcp连接…

TVM 从入门到精通 | 安装 TVM (Part 2)

By 超神经内容一览&#xff1a;TVM 共有三种安装方法&#xff1a;从源码安装、使用 Docker 镜像安装和 NNPACK Contrib 安装。本文讲解如何通过 Docker 镜像 和 NNPACK Contrib 安装。关键词&#xff1a;TVM Docker 基础教程 欢迎回到 TVM 文档讲解 101&#xff0c;这个系…

【Python+Appium】开展自动化测试(十二)通过坐标定位元素

目录 前言 1&#xff0c;通过绝对坐标定位&#xff08;不推荐&#xff09; 2&#xff0c;通过相对坐标定位&#xff08;推荐&#xff09; 写在最后 前言 在使用appium做app自动化测试的过程中&#xff0c;可能会遇到元素的属性值不是唯一的情况&#xff0c;导致不能通过fin…

Linux上docker部署Mysql备份与恢复

Linux上Mysql备份与恢复 1.完全备份 完整备份是将所选的全部数据都备份起来&#xff0c;将备份文件生成一个镜像&#xff0c;再保存到其他的硬盘分区中。 1.1 完全备份一个或多个完整的库 ps: 博主mysql是用docker部署的&#xff0c;这时候需要进入docker容器进行操作。 d…

太极限了,JDK的这个BUG都能被我踩到!

之前遇到个文件监听变更的问题&#xff0c;刚好这周末有空研究了一番&#xff0c;整理出来分享给大家。 从一次故障说起 我们还是从故障说起&#xff0c;这样更加贴近实际&#xff0c;也能让大家更快速理解背景。 有一个下发配置的服务&#xff0c;这个配置服务的实现有点特…

详解设计模式:访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。 访问者模式 是一种将数据操作与数据结构分离的设计模式&#xff0c;它可以算是 23 中设计模式中最…

NewStar CTF Week3Misc 4-5Web

目录 <1> Week-3 Misc (1) Whats HTTP (2) qsdzs girlfriend 3 (3) WebShell&#xff01; (4) 混沌的图像 <1> Week-4 Web (1) So Baby RCE(%0A进行rce rev|sort读取flag) (2) UnserializeThree(%0d换行rce) <2> week5-web (1) Give me your photo…

step-by-step 配置 gtest 在 vscode 测试 c/c++(Ubuntu 环境下示范)

1. 去把 gtest 装好 详见&#xff1a;CSND-PangCoder-[Ubuntu]GTest安装和测试-https://blog.csdn.net/qq_36251561/article/details/85319547 2. 在 VS Code 打上这几个插件 印象里打上 C TestMate 下面的就会自动装了…如果没有就手动装一下 3. 编写测试脚本 第一步那…