C/C++查找算法-----------------------二分查找详解

2023-12-16

二分查找

定义

二分查找也称折半查找,搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

实例

来自力扣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

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        int i=0,j=nums.size()-1;   //分别指向头和尾
       while(i<=j){
           int m=(i+j)/2;   
           if(nums[m]<target)i=m+1;
           else if(nums[m]>target)j=m-1;
           else return m;
       }
       return -1;
    }
};

对于二分查找首先要定义i和j分别指向头和尾,另外要定义一个m表示中间的节点即m=(i+j)/2,要注意的是如果两个都是int类型的话可能会出现超出范围的情况,所以这个时候可以使用另外一种但是结果都一样的写法:m=i+(j-i)/2就可以避免溢出了
因为这道题的数组是有序的,数组的默认值是递增,如果不是连续的情况则需要在使用二分查找之前先进行排序。

二分查找的过程: 给定目标值和中间数字进行比较,如果相等的话则代表是目标值则直接返回中间数字即下标 如果不相等的话分两种情况:
如果中间的数字大于目标值的话则代表中间数组右边所有的数字都大于目标值,这个时候将右边的所有区间排除
如果中间的数字小于目标值的话则代表中间数组左边所有的数字都小于目标值,这个时候将左边的所有区间排除
最后直到中间的数字等于目标值的话则代表找到了这个数,否则当左边界已经超过右边界表示这个值不存在则直接返回-1,每次查找的时候都将搜索区域减少一半,大大提高了代码的效率,时间复杂度为:O(logn)
注:重要的事情再说一遍,使用二分查找的前提是数组是有序的!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++查找算法-----------------------二分查找详解 的相关文章

随机推荐

  • leetcode对称二叉树(每日一题)

    https leetcode cn problems symmetric tree description 今天我们在来个题目 对称二叉树 其实这道题的思路我觉得和那到判断两棵树是不是相同的题目很相似 写这个题目的思路还是递归 但是我们看这
  • 游戏弹窗找不到emp.dll怎么办?分享5个靠谱的解决方法

    在现代的游戏世界中 我们经常会遇到各种各样的问题 其中 最常见的问题之一就是 无法找到emp dll 或 emp dll丢失 那么 emp dll到底是什么 它有什么作用 为什么会出现丢失的情况呢 不用担心 本文将从这几个方面进行详细解析
  • 计算机msvcr71.dll丢失的解决方法,总结3个有效的方法

    在计算机使用过程中 我们常常会遇到一些错误提示 其中之一就是 msvcr71 dll丢失 这个问题通常是由于系统文件损坏或缺失引起的 会导致某些程序无法正常运行 那么 msvcr71 dll到底是什么呢 它又有什么作用 本文将从多个方面对m
  • msvcp100.dll丢失的常见原因/msvcp100.dll丢失的解决方法分享

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 msvcp100 dll丢失 这个错误提示通常出现在运行某些程序或游戏时 给使用者带来了很大的困扰 那么 究竟是什么原因导致了msvcp100 dll文件的丢失呢 本文将详细解析
  • IBIS AMI Model 算法模式的选择

    常规的信号完整性仿真 只会包含传统的基于IBIS的芯片行为级模型 但高速串行总线在使用过程中 经常会由于传输信道或链路过长以及信号频率较高而造成信号衰减过大 接收端无法正确判别信号 因此 这类SerDes芯片都需要集成均衡或者加重等信号处理
  • 解决msvcr100.dll丢失的3个靠谱方法,快速修复dll缺失问题

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 msvcr100 dll丢失 这个错误通常会导致某些程序无法正常运行 而当我们看到 msvcr100 dll是什么 这个问题时 可能会感到困惑 那么 msvcr100 dll究竟
  • 如何进行代码混淆?方法与常见工具介绍

    如何进行代码混淆 方法与常见工具介绍 目录 什么是代码混淆 代码混淆的方法 常见代码混淆工具 什么是代码混淆 代码混淆是指将计算机程序的代码转换成一种功能上等价 但难于阅读和理解的形式的行为 混淆后的代码很难被反编译 即使反编译成功也很难得
  • 华为OD机试真题-快递员的烦恼-2023年OD统一考试(C卷)

    题目描述 快递公司每日早晨 给每位快递员推送需要送到客户手中的快递以及路线信息 快递员自己又查找了一些客户与客户之间的路线距离信息 请你依据这些信息 给快递员设计一条最短路径 告诉他最短路径的距离 注意 1 不限制快递包裹送到客户手中的顺序
  • 产品经理必掌握自定义元件&流程图&泳道图

    艳艳耶 个人主页 个人专栏 越努力 越幸运 目录 一 什么是自定义元件 1 1如何自定义元件 二 什么是流程图 泳道图 2 1什么是流程图 2 2如何画流程图 2 3什么是泳道图 2 4如何画泳道图 三 流程图和泳道图的区别 四 流程图案列
  • 评论送书:一本书讲透Java线程:原理与实践

    摘要 互联网的每一个角落 无论是大型电商平台的秒杀活动 社交平台的实时消息推送 还是在线视频平台的流量洪峰 背后都离不开多线程技术的支持 在数字化转型的过程中 高并发 高性能是衡量系统性能的核心指标 越来越多的公司对从业人员的多线程编程能力
  • 解决ps找不到MSVCP140.dll的5种方法,完美解决

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 找不到MSVCP140 dll 这个问题通常出现在安装Adobe Photoshop 简称PS 时 MSVCP140 dll是Microsoft Visual C 2015 Re
  • 【Linux】公网远程访问AMH服务器管理面板

    目录 1 Linux 安装AMH 面板 2 本地访问AMH 面板 3 Linux安装Cpolar 4 配置AMH面板公网地址 5 远程访问AMH面板 6 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的
  • 2023年度盘点:AIGC、AGI、GhatGPT、人工智能大模型必读书单

    文末送书 今天推荐几本AIGC AGI GhatGPT 人工智能大模型领域优质书籍 前言 2023年是人工智能大语言模型大爆发的一年 一些概念和英文缩写也在这一年里集中出现 很容易混淆 甚至把人搞懵 LLM Large Language M
  • ADS Via Designer 快速建模举例

    如何快速地对设计中的差分过孔进行建模 是layout前仿真中经常遇到的问题 好在目前主流的仿真软件都提供了独立的过孔建模向导 可以很方便地进行操作 本文以ADS提供的Via Designer向导为例 展示如何快速完成过孔的建模操作 以下图所
  • 代码混淆技术探究与工具选择

    代码混淆技术探究与工具选择 引言 在软件开发中 保护程序代码的安全性是至关重要的一环 代码混淆 Obfuscated code 作为一种常见的保护手段 通过将代码转换成难以理解的形式来提升应用被逆向破解的难度 本文将介绍代码混淆的概念 方法
  • 2023自动化测试框架的设计原则你都知道吗?快来看!

    1 代码规范 测试框架随着业务推进 必然会涉及代码的二次开发 所以代码编写应符合通用规范 代码命名符合业界标准 并且代码层次清晰 特别在大型项目 多人协作型项目中 如果代码没有良好的规范 那么整个框架的代码会风格混杂 晦涩难懂 后续维护会很
  • 【Linux】系统初识之冯诺依曼体系结构与操作系统

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 冯诺依曼体系结构 2 操作系统 OS 1 用户到操作系统再到底层是如何组织
  • 【教程】app备案流程简单三部曲即可完成

    APP备案流程包括以下步骤 1 开发者实名认证 在提交备案申请之前 开发者需要通过移动应用开发平台进行实名认证 这个步骤需要提供身份证号码 姓名 联系方式等信息 并上传相关证件照片或扫描件 2 应用信息登记 开发者需要在应用商店或应用发布平
  • 【Linux】进程周边002之进程状态

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 什么是状态 1 1运行 1 2阻塞
  • C/C++查找算法-----------------------二分查找详解

    二分查找 定义 实例 定义 二分查找也称折半查找 搜索过程从数组的中间元素开始 如果中间元素正好是要查找的元素 则搜索过程结束 如果某一特定元素大于或者小于中间元素 则在数组大于或小于中间元素的那一半中查找 而且跟开始一样从中间元素开始比较