当前位置: 首页 > news >正文

【优选算法 二分查找】二分查找算法入门详解:二分查找小专题

     

 


  x 的平方根


     题目解析     


    算法原理     


    解法一: 暴力解法    


如果要求一个数(x)的平方根,可以从 0 往后枚举,直到有一个数(a),a^2<=x,(a+1)^2>x,a即为所求;


    解法二:二分查找     


    分析二段性     


因为暴力枚举的数字从1开始递增,所以枚举的数是有序的,并且能以 a 为边界点,把枚举的数组分成两个部分 :


因为这道题分 a^2<=x,a^2>x 两种情况,而不是分成三种情况,所以使用不朴素的二分查找;

left 初始化为1,right 的初始化需要商榷,所以以 mid 的值对应的 a^2 和 x 的大小关系进行讨论 :

  • 1.  a^2 <= x

  •  2.  a^2 > x


    处理细节问题    

根据范围,我们可以发现 x 是可以小于1的,如果当 x=0.5之类的小数,那么开根号得到的数的整数部分一定是0,所以当 x<1,直接返回0即可;所以 left 初始化为1


    编写代码    




 搜索插入位置


     题目解析    


    算法原理     


     解法:二分查找   


    查找二段性    


通过下面的例子可以发现,插入的位置要么是第一个大于 target 的数的下标,要么是 target 大于数组中所有元素,而被插入到末尾:

所以插入 target 的位置特点是第一个大于等于 target 的元素下标,这个下标即为返回值,所以有如下二段性:


    left 和 right 的更新策略    


分析 mid 落在上面两个区间时,left 和 right 的更新策略 : 

  • 1.mid >= target

  • 2.mid < target

    编写代码    



 山脉数组的峰顶索引 


      题目解析     


    算法原理    


 如果要找峰顶元素的下标,那么第一个元素和最后一个元素其实是不需要考虑的;


    解法一:暴力枚举    


定义一个指针,从起始位置开始往后扫描,当扫描到一个元素的值大于后面一个元素的值,就返回这个元素的下标,时间复杂度为O(N);


    解法二:二分查找    


     分析二段性     


 我们发现,哪怕这个数组并不是有序的,依旧可以使用二分查找,就是因为数组具有二段性;


     left 和 right 的更新策略    


分析 mid 落在上面两个区间时,left 和 right 的更新策略 :

  • 1. arr[mid] > arr[mid-1]


  • 2. arr[mid] < arr[mid-1]

     编写代码    



寻找峰值


    题目解析     

    算法原理    


  • 如果起始位置是呈现下降趋势的,就直接返回起始位置下标0即可,因为nums[-1]为负无穷;


  •  如果刚开始往后遍历,一直是上升,直到峰值后下降,返回峰值下标:


  • 当遍历完所有数组,都是呈上升趋势,返回最后一个元素下标即可,因为nums[length]为无穷小


    解法一:暴力枚举    


定义一个指针直接往后扫描,根据上面的三种情况作出相应的处理即可;时间复杂度是考虑最坏的情况,如第三种情况,所以为O(N)


    解法二:优化暴力解法,二分查找    


     分析二段性     


 我们分析数组任意区间相邻两个点的情况:

  • 1.  nums[i] > nums[i+1] ,在[0,i] 区间一定存在至少一个峰值,接下来可以去 [0,i] 区间找: 


  • 2.  nums[i] < nums[i+1],在 [i+1,length-1] 区间至少存在一个峰值,所以可以去这个区间找:

所以根据 nums[i] 与 nums[i+1] 的关系,把数组分成了两部分,去其中一个部分查找结果;

刚刚在山峰数组中找索引,还算不上严格的无序;这道题是严格的无序,但是依旧能使用二分查找解决,说明二段性是决定一个题能否使用二分查找的必要条件;


     left 和 right 的更新策略    


 根据 arr[mid] 和 arr[mid+1] 的关系,更新left 和right;

  • 1.  arr[mid] > arr[mid+1] ,在[0,mid] 区间一定存在至少一个峰值:


  • 2. arr[mid] < arr[mid+1],在 [i+1,length-1] 区间至少存在一个峰值:

    编写代码     


     暴力枚举     


     二分查找     


 寻找旋转排序数组中的最小值


     题目描述    


    算法原理    


经过旋转的数组有什么特性呢?


 因为数组元素是互不相同的,所以折线图又可以分成两部分:

左边部分严格在nums的分界线上面,右边部分严格在nums分界线下面,并且两个折线部分都是递增的;


    解法一:暴力枚举    


从前往后扫描数组,直到找到最小值;时间复杂度O(N);暴力解法慢就慢在没有利用旋转数组能分成两个递增折线,且左边严格高于右边的特性; 


    解法二:二分查找    


    分析二段性    


如果把问题抽象成折现图,那么就会发现这个数组有明显的二段性,数组的两个部分被分界线严格划分; 对于AC,nums[i] > nums[length-1];对于DE,nums<=nums[length-1];

注意:本题的特殊之处,是拿中间元素的值和末尾元素的值的大小关系,来分成两个区间 


所以要找最小值,我们只需要找到下标分割线所在的位置,即是最小值下标位置,所以就是查找右边区域的左端点


    left 和 right 的更新策略    


 分析 mid 落在上面两个区间时,left 和 right 的更新策略 :

注意,这个数组是经过有序递增数组旋转得到的数组,这就避免了很多边界情况的讨论,旋转数组的值分布一定是分成两个递增折线,并且左边折线严格都大于右边;

  •     1. AC:nums[mid] > nums[length-1]    


  •     2. DF:nums[mid] <= nums[length-1]    

上面是以末尾元素为参照物,我们可以选起始元素为参照点吗?

我们发现,AC区间是严格大于nums[0] 的,CD区间也是严格小于 nums[0] 的,也具有二段性;


    编写代码    


 


0~n-1中缺失的数字


   题目描述   



    算法原理    


    解法一:哈希表    


如果是n个数字,就建 n+1个桶的哈希表,遍历原始数组并且填入哈希表,最后找出 val=0 的key即可;时间复杂度为 O(N),但是还要利用O(N)的空间复杂度


    解法二:直接遍历    


从前往后直接遍历,时间复杂度为 O(N);


    解法三  :位运算     


异或 ^ ,把缺失元素的数组,和完整数组的每一个元素进行异或操作:

 


异或有一个特性,就是相同元素相互抵消,最终异或结果就是缺失的数;

时间复杂度为 O(N)


       解法四:数学方法(高斯 / 等差数列求和公式)    


因为数组是一个等差升序数组,就是一个等差数列,把完整的数组通过等差数列求和公式求出,再依次减去缺失数字的数组,即可得到缺失的元素;时间复杂度为 O(N)


     解法五:二分查找      


    分析二段性    


我们把缺失元素的数组下标标注出来,帮助我们发现二段性: 

此时,我们发现,数组可以分成两个区域,下标和元素一 一对应是一个区域,不是一 一对应,则是类外一个区域,因此,这个数组就有二段性;


    left 和 right 的更新策略    


如果下标和元素对应,left=mid+1,不能对应则 right = mid; 


    编写代码    


 

可以把两种特殊的情况合并成一种:


     

 

相关文章:

【优选算法 二分查找】二分查找算法入门详解:二分查找小专题

x 的平方根 题目解析 算法原理 解法一&#xff1a; 暴力解法 如果要求一个数(x)的平方根&#xff0c;可以从 0 往后枚举&#xff0c;直到有一个数(a)&#xff0c;a^2<x&#xff0c;(a1)^2>x&#xff0c;a即为所求&#xff1b; 解法二&#xff1a;二分查找 …...

如何将CSDN博客下载为PDF文件

1.打开CSDN文章内容 2.按键盘上的f12键&#xff08;或者右键—审查元素&#xff09;进入浏览器调试模式&#xff0c;点击控制台&#xff08;Console&#xff09;进入控制台 3.在控制台输入以下代码&#xff0c;回车 4.在弹出的打印页面中将布局设置成横向&#xff0c;纵向会…...

pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具

一、简介 MinerU是开源、高质量的数据提取工具&#xff0c;支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面&#xff0c;适用于学术、商业、金融、法律等多领域&#xff0c;提高数据获取效率。一站式、开源、高质量的数据提取工具&…...

2024年下半年网络工程师案例分析真题及答案解析

2024年下半年网络工程师案例分析真题及答案解析 试题一(15分) [说明] 公司为某科技园区的不同企业提供网络服务,不同企业的业务有所不同,每个企业因业务需要在不同的地点有多个分支机构。其拓扑结构如图1所示。企业用户通过楼层接入交换机、楼栋汇聚交换机和区域交换机接…...

English phonetic symbol

英语音标发音表-英语48个音标在线读 (jiwake.com) 【英语音标教程】从此学会国际音标|英式音标|BBC音标教程全解_哔哩哔哩_bilibili 元音 单元音 /iː/,/ɪ/ 这两个音不是发音长短的区别&#xff0c; /uː/ /ʊ/ 上面那个就正常读&#xff0c;下面那个她的气大概是往你斜…...

普及组集训--图论最短路径设分层图

P4568 [JLOI2011] 飞行路线 - 洛谷 | 计算机科学教育新生态 可以设置分层图&#xff1a;(伪代码&#xff09; E(u,v)w;无向图 add(u,v,w),add(v,u,w); for(j1~k){add(ujn,vjn,w);add(vjn,ujn,w);add(ujn-j,vjn-j,0);add(vjn-j,ujn-j,0); } add(ujn-j,vjn-j,0); add(vjn-j,uj…...

SYN6288语音合成模块使用说明(MicroPython、STM32、Arduino)

模块介绍 SYN6288中文语音合成模块是北京宇音天下科技有限公司推出的语音合成模块。该模块通过串口接收主控传来的语音编码后&#xff0c;可自动进行自然流畅的中文语音播报。 注&#xff1a;SYN6288模块无法播报英文单词和句子&#xff0c;只能按字母播报英文 &#xff1b;而…...

Spring完整知识三(完结)

Spring集成MyBatis 注意 Spring注解形式集成MyBatis时&#xff0c;若SQL语句比较复杂则仍采用映射文件形式书写SQL语句&#xff1b;反之则用注解形式书写SQL语句&#xff0c;具体可详见Spring注解形式 环境准备相同步骤 Step1&#xff1a; 导入相关坐标&#xff0c;完整pom.…...

保姆级教程Docker部署Redis镜像

目录 1、创建挂载目录和配置文件 2、运行Redis镜像 3、查看redis运行状态 1、创建挂载目录和配置文件 # 创建宿主机Redis配置文件存放目录 sudo mkdir -p /data/docker/redis/conf# 创建Redis配置文件 cd /data/docker/redis/conf sudo touch redis.conf 到Github上找到Redi…...

子类有多个父类的情况下Super不支持指定父类来调用方法

1、Super使用方法 super()函数在Python中用于调用父类的方法。它返回一个代理对象&#xff0c;可以通过该对象调用父类的方法。 要使用super()方法&#xff0c;需要在子类的方法中调用super()&#xff0c;并指定子类本身以及方法的名称。这样就可以在子类中调用父类的方法。 …...

AI大模型ollama结合Open-webui

AI大模型Ollama结合Open-webui 作者:行癫(盗版必究) 一:认识 Ollama 1.什么是Ollama ​ Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型,降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和…...

RK3568笔记2:NOR_Flash和NAND_Flash与SDMMC和eMMC

1. 本质区别 特性NOR Flash/NAND FlashSDMMC/eMMC定义基础存储器&#xff08;原始闪存芯片&#xff09;基于闪存芯片的存储模块&#xff0c;带有控制器组成结构只有原始存储芯片存储芯片 控制器控制方式需主机直接控制&#xff0c;读写逻辑由主机完成内置控制器&#xff0c;主…...

windows python qt5 QChartView画折线图

环境&#xff1a;windows pyqt5 &#xff0c;用QCartView画折线图 环境需要提前安装 pip install PyQtChart 折线图随着时间推移会不断移动&#xff0c;主动更新x轴坐标 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout from PyQt5.QtChart imp…...

阿里云通义千问:全面解析智能云服务先锋

一、技术架构与基础 模型构建基石 采用大规模语料库训练&#xff0c;涵盖多领域知识&#xff0c;如科学、历史、文学等&#xff0c;确保知识储备丰富多样。运用先进的神经网络架构&#xff0c;深度优化模型结构&#xff0c;提高信息处理效率与准确性。持续的语料更新机制&…...

QT 贪吃蛇

1.注意点 新new对象时&#xff0c;要food->show(),否则屏幕不显示 setText() 要求字符串 事件的触发必须写在QWidget中或这是他的子类才能触发&#xff0c;snake.cpp继承的是QTimer 产生动态的原因是定时器每间隔一秒执行一次 信号可以定义在别的.cpp中&#xff0c;只要连接…...

二、点亮希望之光:寄存器与库函数驱动 LED 灯

文章目录 一、寄存器1、存储器映射2、存储器映射表3、寄存器4、寄存器映射5、寄存器重映射6、总线基地址、外设基地址、外设寄存器地址7、操作寄存器&#xff08;以操作一个GPIO口为例&#xff09;1. 寄存器地址定义部分2. GPIOD_Configuration 函数部分3. main 函数部分 二、库…...

Oracle 用户管理模式下的恢复案例-不完全恢复

1. 不完全恢复的几种常用方法 01. recover database using backup controlfile 如果丢失当前控制文件&#xff0c;用冷备份的控制文件恢复的时候&#xff0c;用来告诉 oracle&#xff0c;不要以 controlfile 中的 scn 作为恢复的终点&#xff1b; 02. recover database until …...

SharpDevelop IDE IViewContent.cs类

文件位置&#xff1a;IViewContent.cs /// <summary>/// IViewContent is the base interface for "windows" in the document area of SharpDevelop./// A view content is a view onto multiple files, or other content that opens like a document/// (e.…...

Unity RectTransUtility工具类

这个工具主要是用于动态生成UI的情况。项目中我们通过配置UI的锚点、位置以及大小(位置、大小都是通过蓝湖看到的)&#xff0c;然后通过代码动态生成UI。 大部分情况下只要合理设置锚点&#xff0c;那么生成出来的UI就已经满足了适配的要求。 using UnityEngine;public static…...

React性能优化

三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意&#xff1a;例如组件组合的形式&#xff0c;<Test><Counter></Counter></Test>,即使Test发生了重新渲染&#xff0c;Counter也不会重新渲染。另外使用React这样的库或框架时&a…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...