【算法集训】基础算法:二分查找 | 概念篇

news2024/11/27 18:44:33

二分枚举,也叫二分查找,指的就是给定一个区间,每次选择区间的中点,并且判断区间中点是否满足某个条件,从而选择左区间继续求解还是右区间继续求解,直到区间长度不能再切分为止。
由于每次都是把区间折半,又叫折半查找,时间复杂度为 O(logn),和线性枚举的求解结果一直,但是高效许多,返回值可以是下标,也可以是元素本身。

【例题3】只有两种颜色的数组 arr ,左边部分为红色用 0 表示,右边部分为绿色用 1 表示,要求找到下标最小的绿色元素的下标。


如图所示,下标最小的绿色元素的下标为 3,所以应该返回 3。

算法分析

1)目标

对于这个问题,当我们拿到这个数组的时候,第一个绿色位置在哪里,我们是不知道的,所以,现在的目标就是要通过二分枚举找到红色区域和绿色区域的边界。

2)游标

利用线性枚举的思路,我们引入游标的概念,只不过需要两个游标,左边一个红色游标,右边一个绿色游标。并且游标初始位置都在数组以外,对于一个 n 个元素的数组,红色游标初始位置在 -1,绿色游标初始位置在 n。

3)二分

我们将两个游标相加,并且除 2,从而得到游标的中点,并且判断中点所在位置的颜色,发现是绿色的,这说明从 中点游标 到 绿色游标 的元素都是绿色的。如下图所示:

于是,我们可以把 绿色游标 替换成 中点游标,如下图所示:

这样就完成了一次二分,区间相比之前,缩小了一半。注意,我们要求的解,一定永远在 红色游标 和 绿色游标 之间。
然后,我们继续将两个游标相加,并且除 2,从而得到游标的中点,并且判断中点所在位置的颜色,发现是红色的,这说明从 红色游标 到 中点游标 的元素都是红色的。如下图所示:

于是,我们可以把 红色游标 替换成 中点游标 ,如下图所示:

同样上述算法,再经过两次二分以后,我们得到了如下结果:

这个时候,这个时候 红色游标 和 绿色游标 的位置一定相差 1,并且 绿色游标 的位置就是我们这个问题要求的解。

二分查找模版

int binarySearch(int *arr, int arrSize, int x) {
    int l = -1, r = arrSize; // (1)
    int mid;
    while(r - l > 1) { // (2
        mid = l + (r - l) / 2; // (3)
        if( isGreen(arr[mid], x) ) {
            r = mid; // (5)
        }else {
             l = mid; // (6)
        }
    }
    return r; // (7)
}

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

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

相关文章

AI图片四季更替解决方案,一键切换,四季美景尽在指尖

随着科技的不断进步,人工智能(AI)已经渗透到我们生活的方方面面,为各行各业带来了前所未有的变革。在图像处理领域,美摄科技凭借领先的AI技术,推出了一款创新的AI图片四季更替解决方案,让风景图…

php反序列化题目

[NewStarCTF 公开赛赛道]UnserializeOne 分析代码,最终需要调用到 file_get_contents 即可获得flag 从后往前分析 触发 __invoke 需要 以调用函数的方式调用一个对象 可以找到Start类 里的__isset中可以将类当作函数调用 所以需要调用到 __isset 就需要 isset()…

微服务篇面试题

1、SpringCloud的组件有哪些? 2、负载均衡如何实现? 3、什么是服务雪崩?怎么解决? 4、项目中有没有做过限流? Tomcat单体可以,分布式不适合 5、解释一下CAP和BASE P:加入node03这边的网络断了&a…

提示工程中的10个设计模式

我们可以将提示词定义为向大型语言模型(Large Language Model,LLM)提供的一个查询或一组指令,这些指令随后使模型能够维持一定程度的自定义或增强,以改进其功能并影响其输出。我们可以通过提供细节、规则和指导来引出更有针对性的输出&#x…

PostgreSQL入门到实战-第五弹

PostgreSQL入门到实战 PostgreSQL查询语句(二)官网地址PostgreSQL概述PostgreSQL给列取别名理论PostgreSQL给列取别名实操更新计划 PostgreSQL查询语句(二) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.post…

【Labview】虚拟仪器技术

一、背景知识 1.1 虚拟仪器的定义、组成和应用 虚拟仪器的特点 虚拟仪器的突出特征为“硬件功能软件化”,虚拟仪器是在计算机上显示仪器面板,将硬件电路完成信号调理和处理功能由计算机程序完成。 虚拟仪器的组成 硬件软件 硬件是基础,负责将…

【Linux】进程状态僵尸进程和孤儿进程阻塞、挂起和运行

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. Linux的进程状态2.1 S状态2.2 R状态2.3 T/t状态2.4 D状态 3. 僵尸进程和孤儿进程3.1 僵尸进程3.2 孤儿进程 4. 进程的阻塞、挂起和运行4.1 运行4.2 阻塞状态4.3 挂起4.4 进程切换 1. 前言 上一篇博客中提到…

Redis: 持久化

文章目录 一、RDB持久化1、概念2、生成、载入RDB文件3、执行时机(1) 执行save命令(2)执行bgsave命令(3)Redis停机时(4)触发RDB条件 4、bgsave原理5、小结 二、AOF持久化1、概念2、AO…

Linux学习-网络UDP

网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式(数据报、流式&#…

C++STL(list类)

文章目录 1.list类的介绍2.list的基本用法2.1 基本用法2.2 迭代器失效2.3 reverse(逆置)2.3 sort(排序)2.4 unique(去重)2.5 splice(转移) 3.list的底层(模拟实现)3.1 list的3.2 修改链表问题3.3 完整代码 1.list类的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

代码随想录阅读笔记-二叉树【将有序数组转换为二叉搜索树】

题目 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 思路 做这道题目之前大家可以了解一下之前讲到的一些问题 从中序和后序遍历…

红豆开箱上手必读

什么是红豆? 红豆开源平台是由奇迹物联发布并主导维护的 LTE Cat1 物联网产品开发平台,它是基于 Cat1 蜂窝通信模组 AM430E 构建的技术开源平台。该平台的目标是帮助物联网行业从业者利用搭乐高模块化模式进行 Open CPU 开发,它为开发者提供…

C++:类与对象(一)

hello,各位小伙伴,本篇文章跟大家一起学习《C:类与对象(一)》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 文章目录 面向对象和面向过程的区别1.类的引入2.…

2024年MathorCup妈妈杯数学建模思路C题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享,点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间:2024年4月11日(周四)12:00 比赛开始时间:2024年4月12日(周五)8:00 比赛结束时间&…

Hello 算法9:图

https://www.hello-algo.com/chapter_graph/graph/#911 图的基本概念 图由顶点和边组成,比起链表(线性数据结构)和树(分治结构),图更自由也更复杂 方向性 在无向图中,边表示两个顶点之间的双…

苹果手机怎么查找对方手机位置?2招快速定位!

在现代社会中,智能手机已经成为我们生活中不可或缺的一部分。然而,随着手机的普及,我们也面临着一些问题,比如手机丢失或被盗。 在这种情况下,如何快速准确地找到手机的位置就显得尤为重要。苹果手机怎么查找对方手机…

PKI:构建数字安全基石的关键技术

在数字化时代,网络安全已成为我们日常生活和工作的重要组成部分。为了确保数据的完整性、机密性和身份的真实性,公钥基础设施(Public Key Infrastructure,简称PKI)技术应运而生,为构建数字安全基石提供了重…

面试算法-151-矩阵置零

题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 解 class Solutio…

LangChain - 文档加载

文章目录 一、关于 检索二、文档加载器入门指南 三、CSV1、使用每个文档一行的 CSV 数据加载2、自定义 csv 解析和加载3、指定用于标识文档来源的列 四、文件目录 file_directory1、加载文件目录数据2、显示进度条 (tqdm3、使用多线程 use_multithreading4、更改加载…

通用开发技能系列:Scrum、Kanban等敏捷管理策略

云原生学习路线导航页(持续更新中) 本文是 通用开发技能系列 文章,主要对编程通用技能 Scrum、Kanban等敏捷管理策略 进行学习 1.什么是敏捷开发 敏捷是一个描述软件开发方法的术语,它强调增量交付、团队协作、持续规划和持续学习…