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

Leetcode二分搜索法浅析

文章目录

    • 1.二分搜索法
      • 1.1什么是二分搜索法?
      • 1.2解法思路

1.二分搜索法

题目原文:

给定一个 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

1.1什么是二分搜索法?

我们来看AI给出的回答:

二分搜索法,又称折半查找算法,是一种在有序列表(如数组)中高效查找特定元素的搜索算法。该算法利用了列表元素已排序的特性,通过反复将待搜索区间分成两半来缩小查找范围,具体步骤如下:

  1. 初始化: 确定搜索区间,通常开始时是整个列表,设两个指针分别指向列表的起始位置(low)和结束位置(high)。

  2. 计算中间位置: 计算当前搜索区间的中间索引 mid = (low + high) / 2,并获取该位置的元素值。

  3. 比较与决策:

    • 如果中间元素正好是要查找的目标,则搜索结束,返回该元素的位置。
    • 如果目标值小于中间元素,则在左半区间(low 到 mid-1)继续搜索,更新 high = mid - 1。
    • 如果目标值大于中间元素,则在右半区间(mid+1 到 high)继续搜索,更新 low = mid + 1。
  4. 重复步骤2和3,直到找到目标值或搜索区间为空(即 low > high),此时表明目标值不在列表中。

二分搜索法的时间复杂度为 O(log n),其中 n 是列表中元素的数量。这意味着对于大规模数据集合,二分搜索远比顺序搜索(时间复杂度为 O(n))高效。然而,为了应用二分搜索,列表必须事先排序,且通常适用于静态数据或不频繁插入删除操作的数据结构。

可以看出二分搜索法顾名思义就是不断来缩小我们的搜索区间,来查找特定元素的一种高效算法,而在使用二分搜索法时,关键的地方就在于如何确定我们的区间边界。

1.2解法思路

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;while(left <= right){int madile = left+(right - left) / 2;if(nums[madile] > target){right = madile - 1;}if(nums[madile] < target){left = madile + 1;}if(nums[madile] == target){return madile;}}return -1;}
};

开始我们可以给定一个左闭右闭的区间,是左区间left = 0,右区间right = nums.size -1,此时判断边界时就需要考虑:左区间和右区间的关系时小于等于还是小于?

开始我们的思路时给定一个左闭右闭的区间,也就是说左区间的值可以等于右区间,所以在第一个边界判断时,我们的左区间是可以等于右区间的。

当我们对目标值进行判断后,我们的左右区间又该如何判断呢?

第一种情况:当我们所要查找的目标值小于区间中值时,我们需要考虑的是,此时的右区间right是等于madile还是等于madile-1,回到判断条件中nums[madile] > target,这表示我们区间的中值已经大于我们的目标值了,所以我们下一次的判断时,已经不需要考虑madile,所以此时的右区间应该是madile-1

同样的道理当区间中值小于目标值时,我们要更新左区间的值,此时左区间的值为madile+1
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL中的幻读究竟是怎么回事?
  • 0718vscode问答
  • 高性能分布式IO系统BL205 OPC UA耦合器
  • Mojo 编程语言简介
  • 使用LVS+NGinx+Netty实现数据接入
  • FFmpeg播放视频
  • 图扑低代码数字孪生 Web SCADA 智慧钢厂
  • 数据挖掘新技能:Python爬虫编程指南
  • StarRocks on AWS Graviton3,实现 50% 以上性价比提升
  • Linux 操作指令
  • OPC UA边缘计算耦合器BL205工业通信的最佳解决方案
  • 区块链技术在溯源领域的应用
  • 板级调试小助手(4)基于C语言的自定义脚本解析器
  • 【Git远程操作】理解分布式管理 | 创建远程仓库
  • 3、宠物商店智能合约实战(truffle智能合约项目实战)
  • DOM的那些事
  • es的写入过程
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JS数组方法汇总
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • node 版本过低
  • Spring声明式事务管理之一:五大属性分析
  • vue自定义指令实现v-tap插件
  • 包装类对象
  • 工作手记之html2canvas使用概述
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 蓝海存储开关机注意事项总结
  • 两列自适应布局方案整理
  • 前端攻城师
  • 前嗅ForeSpider教程:创建模板
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 我的面试准备过程--容器(更新中)
  • puppet连载22:define用法
  • raise 与 raise ... from 的区别
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #ifdef 的技巧用法
  • ( 10 )MySQL中的外键
  • (C#)一个最简单的链表类
  • (Java入门)学生管理系统
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (学习日记)2024.01.09
  • (转)Oracle存储过程编写经验和优化措施
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .mysql secret在哪_MySQL如何使用索引
  • .Net CF下精确的计时器
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET的数据绑定