三个例题教会你二分法

2023-10-26


二分法?

先看一个很有意思的段子

有一天小明到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把小明拦下,要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 logN 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是小明背着剩下的书走了。 从此,图书馆丢了 N - 1 本书。

相信大家从小学的时候就已经接触过了很多关于二分法的题目了,对于二分法的一些思想这里博主就不展开说了

那么今天博主就从编程算法的角度来讨论,如果遇到二分法的题目该这么解答。

例题

首先我们要知道使用二分法是有一个条件的,那就是必须是顺序排序的,这个我们要注意。

 public static void main(String[] args) {
        int[] nums = {-1, 0, 3, 5, 9, 12};
        int target = 9;
        int n = 9;
        //调用如下方法
        
        //数组查找
        int i = search(nums,target);
        System.out.println(i+1);
        
        //错误版本号
       int j = search2(n);
       System.out.println("错误的版本号为:"+j);
       
        //输出插入位置
        int k = search3(nums, target);
        System.out.println("插入位置是"+(k+1));
    }

数组查找

给定一个数组和一个目标值,需要找到这个目标值在数组中的位置,并打印,如果没有则输出-1

    private static int search1(int[] nums, int target) {
//        定义数组的左右指针
        int left = 0, right = nums.length - 1;
//        判断条件:当左指针大于右指针的时候,我们默认循环结束
        while (left < right) {
//          定义一个数用接收二分法所选的位置 = 左指针位置+剩余长度的一半
            int mid = left + (right - left) / 2;
//           判断条件
            if (nums[mid] > target) {//如果所选的这个数大于目标值,那么目标值在它的左边
//                这个时候就需要调整右指针
                right = mid - 1;//需要注意数组下标越界
            } else if (nums[mid] < target) {//反之亦然
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -2;
    }

错误版本号

你是产品经理,目前正在带领一个团队开发新的产品。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

    private static int search2(int n) {
//        在这个代码中我们只需要定义一个左指针
            int left = 0;
//            判断条件依然是当左边界大于右边界时
            while (left < n) {
               int mid = left + (n - left) / 2;
//               在这个题中,给定的条件是需要判断是是否为该版本为错误版本
                if (isBadVersion(mid)) {
//                    所以我们可以直接将这个值赋值给n
                    n = mid;
                } else {
                    left = mid + 1;
                }
            }
            return n;
        }

插入位置

这个题和上面的数组位置中的位置查找有些不同的是,如果这个位置的值不存在那么就把这个位置的索引给返回。

  private static int search3(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target) {
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        //最后返回的是他们的位置
        return left;
    }
   

好了详细就举这三道例题了,二分法的介绍就这样吧,后续博主还会出关于算法题目详解,喜欢的就留下三连吧,我们下片博客见。

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

三个例题教会你二分法 的相关文章

随机推荐

  • 一个项目学会tensorflow2.0

    优化 1 使用数据增强技术 2 使用数据生成器提高训练速度 3 调节超参数 提高模型精度 4 使用VGG技术迁移学习 提高训练速度 目标 算法应用 熟练掌握TensorFlow框架使用 掌握神经网络图像相关案例 1 训练的时候读取本地图片以
  • Failed to fetch https://mirrors.tuna.tsinghua.edu.cn/ubuntu//dists/bionic/main/binary-arm64/Packages

    转载自 Failed to fetch https mirrors tuna tsinghua edu cn ubuntu dists bionic main binary arm64 Packages anthony 36的博客 CSDN
  • echarts图表的x轴和y轴的配置

    xAxis与yAxis中有很多配置项 下面我以xAxis进行详解 yAxis参考xAxis即可 nameTextStyle 坐标轴名称的文字样式 axisLine 坐标轴轴线相关设置 axisTick 坐标轴刻度相关设置 axisLabel
  • bean的一生----Spring容器启动

    1 我这里通过AnnotationConfigApplicationContext来new一个容器对象 可以看到构造方法实现了三个方法 this this register componentClasses this refresh 第一个
  • 硬件基础 - 51单片机IO口

    分析电路定律 1 回路与阻抗 2 电路设计就是波形整形过程 3 继电器 电磁 机械 开关 光耦电子 隔离开关 电气隔离 开关速度慢 三极管 电子开关 开关信号 小功率 高速 MOS 电子开关 大功率 裂变开关 晶闸管 电子开关 IGBT 电
  • 龙族幻想微信一区哪个服务器人多,龙族幻想微信一区-命运之刃开服时间表_龙族幻想新区开服预告_第一手游网手游开服表...

    2019 09 02 10 00 手Q二十四区 王者之争 已经开服 10 00 微信十一区 自由之日 已经开服 2019 08 29 10 00 手Q二十四区 逆卷刃流 已经开服 2019 08 28 10 00 微信十一区 风暴裂隙 已经
  • vivado路径最大时钟约束_【vivado约束学习二】 IO延时约束

    vivado约束学习二 IO延时约束 1 I O延迟约束介绍 要在设计中精确建模外部时序 必须为输入和输出端口提供时序信息 Xilinx Vivado集成设计环境 IDE 仅在FPGA边界内识别时序 因此必须使用以下命令指定超出这些边界的延
  • 全球及中国芯片产业研发方向与投资规模预测报告2022版

    全球及中国芯片产业研发方向与投资规模预测报告2022版 HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年11月 搜索鸿晟信合研究院查看官网更多内容 第一章 芯片相关概念介绍 1 1 芯片的概念 1
  • QML实现Label的文字选择与右键各操作

    在QML中 原生的Label是不能够进行鼠标的选中 复制 全选等操作的 仅仅只能用于简单的展示文字 但是在实际开发中 往往我们需要给用户展示一些信息 而且要支持可以用鼠标进行选择文字 并进行复制操作 所以 用QML中的Label控件显然是不
  • 信息安全意识主题分享-数据安全

    微盟删库 事件沸沸扬扬 这次重大的数据违规行为 导致微盟的股市市值暴跌12亿港币 影响巨大 本文主要为大家介绍针对数据安全的威胁和风险 有哪些安全防护措施 一 数据简介 1 数据的形态 数据主要可以分为两种形态 也就是平时常见的数据的表现方
  • coco游戏android.mk

    LOCAL PATH call my dir include CLEAR VARS LOCAL MODULE game shared LOCAL MODULE FILENAME libgame LOCAL CPP EXTENSION cc
  • 4G版本云音响设置教程阿里云平台版本

    4G版本云音响设置教程介绍 第一章 介绍了在阿里云物联网平台生一个设备使用的三元素 第二章 转换阿里云三元素 为MQTT参数 并下载到设备中 第三章 阿里云物联网套件协议使用说明 如何发送数据至设备并播放 本文目录引导 目录 4G版本云音响
  • egg-jwt的使用

    安装 npm install egg jwt save 配置 config config default js config jwt secret zidingyi 自定义 token 的加密条件字符串 config plugin js j
  • RPC答疑篇

    声明 本篇文章及代码仅供学习交流 严禁用于商业用途 否则由此产生的一切后果均与作者无关 上一篇的rpc发出来后 虽然我觉得我已经写得很细致了 但还是收到了很多私信说是跑不成功 所以再发 水 一篇 关于如何操作的文章 鉴于很多人没有某店的账号
  • Spring-Cloud-Alibaba之Dubbo

    在微服务构架中 不可避免的要遇到服务间的调用 目前的方式是通过RPC或者是rest的http接口调用 spring cloud中很多都使用的feign来做服务调用 在spring cloud alibaba的套装中我们使用dubbo来替换掉
  • 登录认证功能的统一拦截技术(拦截器)

    目录 1 说明 2 使用方法 1 定义拦截器 2 注册配置拦截器 3 示例 3 interceptor详细说明 1 拦截路径 2 执行流程 3 过滤器和拦截器的区别 4 登录校验的拦截器实现 5 全局异常处理 补充说明 1 说明 拦截器是一
  • Redis的三种模式——主从复制、哨兵、集群

    目录 一 Redis模式 二 Redis主从复制 2 1 主从复制概述 2 2 主从复制 2 3 Redis主从复制流程 2 4 搭建Redis主从复制 2 4 1 安装Redis 2 4 2 修改Master节点配置文件 192 168
  • 软件测试实战项目【电商、银行、商城、金融、医药、电商】

    最近 不少读者托我找一个能实际练手的测试项目 开始 我觉得这是很简单的一件事 但当我付诸行动时 却发现 要找到一个对新手友好的练手项目 着实困难 这是博主收集了很久才弄到的 希望可以帮助到你 由于项目太多了就不一一介绍了 只介绍这一个 电商
  • MySQL适合与不适合建索引的情况

    适合建索引情况 主键自动建立唯一索引 频繁作为查询条件的字段应该创建索引 查询中与其它表关联的字段 外键关系建立索引 Where条件里用不到的字段不创建索引 单键 组合索引的选择问题 在高并发下倾向创建组合索引 查询中排序的字段 排序字段若
  • 三个例题教会你二分法

    二分法 二分法 例题 数组查找 错误版本号 插入位置 二分法 先看一个很有意思的段子 有一天小明到图书馆借了 N 本书 出图书馆的时候 警报响了 于是保安把小明拦下 要检查一下哪本书没有登记出借 小明正准备把每一本书在报警器下过一下 以找出