二分查找理论及例题

二分查找(Binary Search)是一种常用的搜索算法,用于在有序数组中快速查找目标值。以下是二分查找的详细理论知识、优缺点以及适用场景:

  1. 理论知识:

    • 基本原理:二分查找通过比较目标值与数组的中间元素,将查找范围缩小一半,直到找到目标值或查找范围为空。
    • 前提条件:二分查找要求数组必须是有序的,可以是升序或降序。
    • 过程步骤:
      • 初始化左右指针,分别指向数组的第一个和最后一个元素;
      • 计算中间元素的索引;
      • 比较目标值与中间元素的大小,根据比较结果调整左右指针;
      • 重复上述过程直到找到目标值或查找范围为空。
  2. 优点:

    • 效率高:二分查找的时间复杂度为O(log n),相较于线性查找的O(n),性能更好。
    • 算法简单:二分查找的实现逻辑清晰,易于理解和实现。
    • 适用于有序数组:只有在有序数组中才能应用二分查找,如果数组无序,则需要先进行排序。
  3. 缺点:

    • 仅适用于有序数组:二分查找要求目标数组是有序的,如果数组无序,则无法应用二分查找。
    • 需要额外空间:二分查找通常需要额外的指针来指示查找范围,使得空间复杂度较高。
    • 数据更新困难:如果目标数组需要频繁更新,如插入、删除等操作,需要重复进行排序,降低效率。
  4. 适用场景:

    • 针对有序数组:二分查找适用于对有序数组进行快速查找,可以有效地减少查找时间。
    • 大规模数据查找:对于大规模数据集合,二分查找能够迅速缩小查找范围,提高查找效率。
    • 需要高效查找的场景:在对数据要求较高且需要快速查找的场景中,二分查找是一个好的选择。

以上是关于二分查找的详细理论知识、优缺点以及适用场景。希望对你有帮助!

接下来来到简简单单的小例题:

704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1


示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
// 在有序数组中搜索目标值并返回其索引
public int search(int[] nums, int target) {int l = 0; // 左边界int r = nums.length; // 右边界,注意这里是数组长度,不是最后一个元素的索引while (l <= r) { // 当左边界小于等于右边界时执行循环int mid = (l + r) / 2; // 计算中间位置if (target == nums[mid]) { // 如果目标值等于中间值,返回中间索引return mid;}if (target < nums[mid]) { // 如果目标值小于中间值,缩小右边界r = mid - 1;}if (target > nums[mid]) { // 如果目标值大于中间值,增大左边界l = mid + 1;}}return -1; // 未找到目标值,返回-1
}

 

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

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

相关文章

Qt(五)网络编程

文章目录 一、QTcpServer类&#xff08;一&#xff09;使用&#xff08;二&#xff09;示例1. 服务端2. 客户端&#xff1a; 二、 一、QTcpServer类 QTcpServer类用于监听客户端的连接&#xff0c;每当有一个客户端连接到服务端&#xff0c;都会生成一个新的QTcpSocket对象与客…

【每日一练】python面对对象的基本概念和用法(附实例)

面向对象编程&#xff08;OOP&#xff09;是一种程序设计方法&#xff0c;其基本概念包括对象、类、继承和封装。 对象&#xff1a;对象是系统中的基本单位&#xff0c;用于描述客观事物。每个对象包含一组属性和对这些属性进行操作的方法。对象是类的一个实例&#xff0c;具有…

Spark SQL----NULL语义

Spark SQL----NULL语义 一、比较运算符中的空处理二、逻辑运算符中的空处理三、表达式中的空处理3.1 null-intolerant表达式中的空处理3.2 可以处理空值操作数的空处理表达式3.3 内置聚合表达式中的空处理 四、WHERE、HAVING和JOIN子句中的条件表达式的空处理五、在GROUP BY和D…

Camera Raw:直方图

Camera Raw 的直方图 Histogram面板不仅提供了照片亮度和色彩分布信息&#xff0c;还具备多项实用功能&#xff0c;辅助评估和调整照片。 ◆ ◆ ◆ 直方图的构成 直方图是一个二维坐标系统&#xff0c;横坐标表示不同程度的像素亮度&#xff0c;从左到右通常对应的是 0 ~ 255…

升级springboot3.2集成shiro的问题

由于之前的springcloud相关版本太久&#xff0c;很多新功能无法使用&#xff0c;所以打算抽时间把代码的版本做一下升级。使用最新版的springboot3.2&#xff0c;发现shiro过滤器无效。经检查发现原因&#xff1a; springboot3.x使用的是JDK17&#xff0c;从jdk8以后javax.serv…

视频智能解析:Transformer模型在视频理解的突破性应用

视频智能解析&#xff1a;Transformer模型在视频理解的突破性应用 随着人工智能技术的飞速发展&#xff0c;视频理解已成为计算机视觉领域的一个热点问题。Transformer模型&#xff0c;以其在处理序列数据方面的强大能力&#xff0c;已经被广泛应用于视频理解任务中。本文将深…

Github 2024-07-11 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Python项目1frp: 一个开源的快速反向代理 创建周期:2946 天开发语言:Go协议类型:Apache License 2.0Star数量:75872 …

Spring的bean的生命周期——bean的创建与销毁

1、生成类信息map 扫描包&#xff0c;用asm技术获取类信息&#xff0c;打了ComponentScancomponentservice等注解的类会放入map。key是类名&#xff0c;value是beanDefinition类的基本信息 2、加载类 context.getBean("userService") 从类信息map中获取beanDefin…

SSRF漏洞深入利用与防御方案绕过技巧

文章目录 前言SSRF基础利用1.1 http://内网资源访问1.2 file:///读取内网文件1.3 dict://探测内网端口 SSRF进阶利用2.1 Gopher协议Post请求2.2 Gopher协议文件上传2.3 GopherRedis->RCE2.4 JavaWeb中的适用性&#xff1f; SSRF防御绕过3.1 Url黑名单检测的绕过3.2 Url白名单…

对controller层进行深入学习

目录 1. controller层是干什么的&#xff1f;1.1 controller原理图1.2 controller层为什么要存在&#xff1f;1.2.1 分离关注点1.2.2 响应HTTP请求1.2.3 数据处理与转换1.2.4 错误处理与状态管理1.2.5 流程控制1.2.6 依赖注入与测试 1.3 controller层的优点1.3.1 多端支持1.3.2…

Gin框架自定义路由

Gin框架是一个用Go语言&#xff08;Golang&#xff09;编写的Web框架&#xff0c;它提供了灵活且高效的路由系统。在Gin框架中&#xff0c;自定义路由是一个基础且重要的操作&#xff0c;它允许开发者定义应用程序如何处理不同的HTTP请求。以下是自定义路由的详细步骤和方法&am…

Linux虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理

Linux 虚拟化大师&#xff1a;使用 KVM 和 QEMU 进行高级虚拟化管理 虚拟化技术是现代数据中心的核心技术之一&#xff0c;它可以将一台物理服务器分割成多个虚拟机&#xff0c;从而提高资源利用率&#xff0c;降低成本&#xff0c;并增强系统的灵活性和可扩展性。KVM&#xf…

C++ | Leetcode C++题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack { public:queue<int> q;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n q.size();q.push(x);for (int i 0; i < n; i) {q.push(q.front());…

C++ 【 Open3D 】 点云按高程进行赋色

一、 Open3D中根据点云的高程度信息为点云中的每个点附上颜色&#xff0c;并保存颜色渲染结果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------读取点云--------------------------…

nasa数据集——1 度网格单元的全球月度土壤湿度统计数据

AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Averages V005 (AMSRE_AVRMO) at GES DISC GES DISC 的 AMSR-E/Aqua 第 3 级全球地表土壤水分月平均值 V005 (AMSRE_AVRMO) AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Standard Deviation V005 (…

优化 .NET Core 应用程序的安全性和性能以应对高负载

一. .NET Core 中的安全措施 1. 身份验证和授权 实施强大的身份验证和授权机制是保护应用程序资源的基础。.NET Core 内置支持各种身份验证方案&#xff0c;例如 JWT&#xff08;JSON Web 令牌&#xff09;、OAuth 和 OpenID Connect。通过配置身份验证中间件并定义授权策略&…

vue中el-table单元格复制功能

一、单页面中使用 1.在el-table上绑定单击事件 cell-click“copyText” 或双击事件 cell-dblclick“copyText” 注&#xff1a;cell-dblclick函数有四个参数&#xff0c;分别是row, column, cell, event&#xff1b; row&#xff1a;可看到被其操作单元格所在行的所有的数据&…

【IT领域新生必看】解锁 `final` 关键字的秘密:Java 编程中的终极武器

文章目录 引言什么是 final 关键字&#xff1f;一、 final 变量final 局部变量final 实例变量final 静态变量 二、 final 方法三、 final 类四、 final 关键字的实际应用1. 定义常量2. 防止方法被重写3. 创建不可变类4. 优化性能 五、 final 的一些常见误区1. final 变量不能在…

力扣995.K连续位的最小翻转次数

力扣995.K连续位的最小翻转次数 因为翻转顺序改变不影响最终结果 因此从头找每个位置翻转后的结果如果为0 将从它开始的K长的数组翻转 class Solution {public:int minKBitFlips(vector<int>& nums, int k) {int n nums.size();vector<int> s(n1);int res0…

05.FFMPEG日志系统

一、头文件 #include <libavutil/log.h> 二、常用函数 1、av_log_set_level void av_log_set_level(int level);该函数用于设置全局日志级别。 2、av_log void av_log(void* avcl, int level, const char* fmt, ...);该函数用于输出日志消息。avcl 参数是相关联的上下…