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

二分法介绍

二分法

  • 一、介绍
  • 二 、二分法边界
    • 1. 一般二分法
    • 2. 左边界二分法
    • 3. 右边界二分法
  • 三、代码实现
    • 1、一般二分法
    • 2、左边界二分法
    • 3、右边界二分法

一、介绍

二分法(Binary Search)是一种常用的查找算法,它的原理是将有序数组分成两部分,通过比较目标值与数组的中间值,可以确定目标值在哪一部分中,然后再继续在目标部分进行查找,直到找到目标值或者确定目标值不存在。

二 、二分法边界

二分法可以分为以下三种情况:

1. 一般二分法

对于有序数组,目标值可能存在也可能不存在。如果找到目标值则返回其索引,否则返回-1。

2. 左边界二分法

对于有序数组,目标值可能存在也可能不存在。如果找到目标值则返回其索引,否则返回比目标值小的最大值的索引。

3. 右边界二分法

对于有序数组,目标值可能存在也可能不存在。如果找到目标值则返回其索引,否则返回比目标值大的最小值的索引。

三、代码实现

1、一般二分法

public int binarySearch(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}

2、左边界二分法

public int leftBinarySearch(int[] nums, int target) {int left = 0;int right = nums.length;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid;}}return left;
}

3、右边界二分法

public int rightBinarySearch(int[] nums, int target) {int left = 0;int right = nums.length;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] <= target) {left = mid + 1;} else {right = mid;}}return left - 1;
}

以上代码中,nums是有序数组,target是目标值。在每一次循环中,通过计算中间值mid来比较目标值与中间值的大小关系,根据比较结果更新leftright的值,直到找到目标值或者确定目标值不存在。
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python生成指定数量的随机XML文件
  • 572. 另一棵树的子树
  • Python自动化:Excel根据IP匹配网段获取所属源端口
  • 探索OpenCV:图像处理基础与实践
  • 如何解决“Intel (R) Wireless-AC 9560 160MHz 设备无法启动“?
  • SpringBoot下调用kettle脚本
  • Linux--数据链路层(macarp)
  • 实战演练:利用京东API一键抓取商品详情
  • SQL AI 工具:颠覆数据库管理与分析的创新力量
  • 如何在MySQL中禁止修改数据库表的特定列
  • 27. 聚合 DataFrame:探索数据的强大力量
  • 了解一下 CSS 的了解font-variant-alternates属性
  • 三防平板:定制化服务的趋势——以智慧医疗为例
  • 家用超声波清洗机哪个品牌好用?真正好用的超声波清洗机品牌
  • [线程]线程不安全问题 --- 死锁
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android单元测试 - 几个重要问题
  • CSS 三角实现
  • jquery ajax学习笔记
  • laravel 用artisan创建自己的模板
  • php中curl和soap方式请求服务超时问题
  • 漂亮刷新控件-iOS
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序button引导用户授权
  • 协程
  • 新书推荐|Windows黑客编程技术详解
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • Prometheus VS InfluxDB
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #《AI中文版》V3 第 1 章 概述
  • #Lua:Lua调用C++生成的DLL库
  • #stm32驱动外设模块总结w5500模块
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • ${factoryList }后面有空格不影响
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二十三)Flask之高频面试点
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)linux下的时间函数使用
  • **python多态
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 给NuGet包添加Readme
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解