【算法学习】二分查找 binary-search (Java 参考)

2023-05-16

题目描述

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

思路分析

此题即有序列表中查找指定元素,是二分查找典型的应用场景。

二分查找主要总结有以下要点:(从左到右依次递增的数组为例)

  1. 开始/结束元素定位(初始化时开始元素 left 为列表第一个下标即 0 ,结束元素 right 定位为 length - 1。减一的原因是计算机计数是从 0 开始,长度为 length 的数组最后一个元素下标为 length - 1
  2. 中间元素定位(中间元素 mid 计算公式为 left + (right - left)/2 ,采取向下取整的方式,长度为 8 的数组,第一次计 mid 为 0+(7-0)/2 = 3,也就是下标为 3 的元素作为第一次查找的中间元素。向上取整和向下取整不会影响查询结果,两种方式是对称的。向下取整的方式等同于将数组翻转后的向上取整
  3. 每次判断后开始/结束元素修改(如果恰巧相等,则可以直接完成查找;如果中间元素小,则待查找对象可能存在右半边,将 left 移动至 mid+1位置;如果中间元素大,则待查找对象可能存在左半边,将 right 移动至 mid-1 位置。此处 mid ±1 可以减少匹配此处,因为 mid 位置已经确定不相等了就不必再纳入查找的列表中。)
  4. 查找结束条件(查找有两种可能存在/不存在,查找结束条件可以设置为 left <= right。此处等号很关键,如果 [1,2] 中查找2,第一次 left = 0,right = 1,mid = 0 ** 中间值小需要查右边,此时left = 1,right = 1,mid = 1** 匹配成功。等号主要在 length 防止遗漏。 )

参考代码

    public int search(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;
            if(nums[mid] < target) left = mid + 1;
            if(nums[mid] > target) right = mid -1;
        }
        return -1;
    }

通过以下网站测试:

力扣测试连接

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

【算法学习】二分查找 binary-search (Java 参考) 的相关文章

  • 在idea中的过滤器

    https blog csdn net u010835486 article details 80730745 案例 xff1a https www bilibili com video av543581547
  • Session

    概念 https www runoob com jsp jsp session html 使用 https www cnblogs com bhlsheji p 4015568 html 登录案例 https blog csdn net q
  • E: package ‘gcc‘ has no installation candidate

    E package gcc has no installation candidate 问题描述 第一次使用gcc编译c语言代码时出现command gcc not found but can be installed with sudo
  • ANOMALY: use of REX.w is meaningless (default operand size is 64)

    1 针对所有程序 注册表中增加项 计算机 HKEY LOCAL MACHINE SOFTWARE TEC Ocular 3 agent config 下 新建 字符串值 hookapi disins 数值数据 1 2 针对特定程序 注册表中
  • google启动错误

  • 安装dlib前需要先安装cmake 和boost。然后才能正确安装dlib

    pip install boost pip install cmake pip install dib
  • anconda国内镜像源

    1 为conda配置 xff08 清华 xff09 镜像源 使用conda进行安装时 xff0c 访问的是国外的网络 xff0c 所以下载和安装包时会特别慢 我们需要更换到国内镜像源地址 xff0c 这里我更换到国内的清华大学地址 xff0
  • Anaconda常用命令大全

    使用conda 首先我们将要确认你已经安装好了conda 配置环境 下一步我们将通过创建几个环境来展示conda的环境管理功能 使你更加轻松的了解关于环境的一切 我们将学习如何确认你在哪个环境中 xff0c 以及如何做复制一个环境作为备份
  • openCV错误模块‘cv2.face‘没有属性‘createEigenFaceRecognizer‘(openCV Error module &#39;cv2.face&#39; has no at

    pip uninstall opencv contrib python pip install opencv contrib python no cache dir 功能也更改为此 load被替换为read import cv2 recog
  • Python enumerate() 函数

    enumerate 函数用于将一个可遍历的数据对象 如列表 元组或字符串 组合为一个索引序列 xff0c 同时列出数据和数据下标 xff0c 一般用在 for 循环当中 Python 2 3 以上版本可用 xff0c 2 6 添加 star
  • python3 opencv3 实现基本的人脸检测、识别功能

    encoding utf 8 老杨的猫 环境 PYCHARM xff0c python3 6 opencv3 import cv2 os import cv2 face as fc 此处有坑 找不到脸 这样引用程序可以运行 xff0c 欢迎
  • idea修改maven镜像

    https jingyan baidu com article c33e3f482455d2ea15cbb526 html https blog csdn net qq 32588349 article details 51461182 阿
  • Error:(1, 1) java: 非法字符: ‘\ufeff‘

    一 问题 用IDEA打开eclipse java项目编译时 xff0c 出现以下错误 xff1a Error 1 1 java 非法字符 ufeff Error 1 10 java 需要class interface或enum 二 原因分析
  • Zemax学习笔记(4)- 设计单透镜实例_1,设置

    Zemax学习笔记 xff08 4 xff09 设计单透镜 1 xff0c 设置 简介镜头分类参数和设计约束镜头数据编辑器定义系统设置定义视场设置波长插入表面输入镜头数据求解 设计单透镜分为3个部分 xff0c 设置 分析和优化 xff0c
  • libnet安装配置

    安装编译 1 下载安装包 http sourceforge net projects libnet dev 2 解压 tar zxvf libnet 1 2 rc3 tar gz 3 进去编译 configure make make ins
  • idea 创建Spring第一个项目

    1 知道什么是maven 网上一般说maven是一个构建工具 xff0c 其实是说得很准确的 xff0c 不过我觉得更准确的说法应该是一个自动化的构建工具 你可以这样说 xff1a 不用maven的时候所有的jar都不是你家的 xff0c
  • anconda 安装dlib

    pip install CMake pip install Boost 前面两个不知道有没有用 xff0c 我是直接安装了 pip install dlib 会直接报错 xff0c 所以要到网上下载whl文件来安装 xff0c 就可以了 用
  • nodejs学习五:sequelize数据库查询的Op方法

    span class token comment 查找users表数据name span span class token keyword const span op span class token operator span model
  • 使用diskpart修复EFI分区变主分区的问题

    diskgenius有时操作EFI分区会把EFI变成主分区 xff0c 太弱智了 xff0c 呵呵 xff0c 但是这个EFI分区本身有可能会变成主分区 xff0c 这样的话系统就无法识别了 xff0c Win8 1系统的diskpart可
  • 程序员会设计后是一种什么样的感觉

    我是一个iOS开发的程序员 xff0c 也是一个自由职业者 平时靠接一些外包和做自己的产品为生 做了这么多年 xff0c 给我的感觉是 xff1a 如果你只会写程序 xff0c 那么做自由职业者的空间要小很多 01 我为什么要学设计 做自己

随机推荐

  • win10笔记本使用virtualbox鼠标失灵

    win10笔记本使用virtualbox6时 xff0c 发现鼠标移动偏差极大 xff0c 完全无法操作虚拟机 解决方法 xff1a 虚拟机设置中将指点设备切换为USB触控板 xff0c 运行虚拟机后右下角鼠标处右键 xff0c 勾选鼠标集
  • SpringMVC的常用注解

    SpringMVC的常用注解 1 64 Controller 64 Controller 用于标记在一个类上 xff0c 使用它标记的类就是一个SpringMVC Controller 对象 2 64 RequestMapping 用于处理
  • Hive学习之修改表、分区、列

    修改表的语句允许改变现有表的结构 通过该语句可以增加列 分区 修改SerDe 增加表和SerDe的属性或者重命名表 与之类似 修改分区的语句可以改变指定分区的属性 重命名表 重命名表的语句如下 ALTER TABLE table name
  • sftp通过秘钥上传,修改文件

    sftp是通过openssh与服务端建立连接的 xff0c 默认端口为22 1 新建一个sftp的用户 xff0c 这里就叫sftp useradd span class hljs operator s span sbin nologin
  • 说说win32 控制台应用程序、win32 项目、mfc项目、空项目那些事儿

    首先 xff0c 说一下空项目 xff0c 大多数想单纯创建c 43 43 工程的新同学 xff0c 打开vs后很可能不知道选择创建什么工程 xff0c 这时候请相信我 xff0c 空项目是你最好的选择 因为空工程不包含任何的源代码文件 x
  • Docker常用命令,使用脚本在线或者离线安装Docker

    查看 停止 删除container 查看运行的容器 docker ps 查看所有容器 docker ps a 查看所有容器id docker ps aq 先停止运行container xff0c 再删除container xff0c 再删除
  • Spring配置数据源(XML)

    1 数据源 xff08 连接池 xff09 的作用 数据源 连接池 是提高程序性能如出现的 事先实例化数据源 xff0c 初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源 连接池 xff1a
  • Python开发GUI工具介绍,实战:将图片转化为素描画!

    阳光普照好刺眼 7月华为云社区与csdn联合举办了黑马程序员的征文活动 xff0c 由于规则简单 xff08 保证原创文章 内容为技术类为主 且文章篇幅1000字 43 即可 xff09 xff0c 所以兴高采烈的参加了活动 本来是抱着打酱
  • spring boot配置加载不出来?

    新建一个项目发现不能用 xff0c maven依赖加载不出来 xff0c 问题界面如下 xff1a 可以明确是maven依赖出了问题 xff0c 检查配置 1 xff09 检查本地仓库是否配置正确 xff1a span class toke
  • iOS NSAttributedString(属性字符串)

    NSAttributedString实际上就是一个字符串和一本字典 字典包含每一个字符的属性 xff1a 包括字体 大小 下划线 颜色等等 关键是要知道字典中每个key的含义以及相应value的取值范围 Character Attribut
  • 无人机姿态解算_互补滤波(1)

    一 基础知识 1 坐标系 xff1a 遵循右手定则 1 1 大地坐标系 xff08 地球坐标系 xff09 xff1a 北 xff08 x轴 xff09 东 xff08 y轴 xff09 地 xff08 z轴 xff09 xff0c 地就是
  • 学会 Go 中的时间处理

    作为程序员 xff0c 我们经常需要对时间进行处理 在 Go 中 xff0c 标准库 time 提供了对应的能力 本文将介绍 time 库中一些重要的函数和方法 xff0c 希望能帮助到那些一遇到 Go 时间处理问题就需要百度的童鞋 应对时
  • Ubuntu修改文件权限

    Linux内的一切皆文件 xff0c 所以对于Linux下文件的管理就十分的重要了 Linux下的文件权限分为三种 xff1a r xff08 读 xff09 xff0c w xff08 写 xff09 xff0c x xff08 执行 x
  • Libnet简单学习

    简单了解后 xff0c 建议直接查看源码 xff0c 以获得其他函数 xff1a libnet libnet functions h File Reference 本文仅列举个别常用函数 libnet工作流程 xff08 1 xff09 通
  • Java模拟生产者消费者模型【仅代码 + 注释】

    模拟仓库容量为1 xff0c 1个消费者 xff0c 1个生产者的生产者消费者模型 span class token keyword package span span class token namespace com span clas
  • PHP8.2 Apache24 Windows10安装步骤

    PHP8 2 Apache24 Windows10安装步骤 1 官网地址 https httpd apache org download cgi 修改1 xff1a Define SRVROOT D WorkSoft Apache Apac
  • navicat乱码和激活

    乱码 xff1a 1 将export LANG 61 34 zh CN UTF 8 34 2 工具 gt 选项下常规 编辑器 xff0c 记录下的字体选Noto sans CJK相近字体 激活 xff1a 第一次执行start navica
  • OnclickListener

    相信很多像我一样的新手学习ANDROID开发会遇到这个问题 xff0c 通过这几天的归类和总结 xff0c 将我的理解写在下面 xff0c 欢迎大家一起前来讨论 xff1a 以按钮BUTTON的监听事件为例 xff0c 以下的监听实现都是等
  • 关于Activity的onNewIntent方法

    前言 onNewIntent方法想必大家都知道 xff0c 是和Activity的启动模式结合起来使用的 xff0c 可以这个方法具体什么情况下被调用 xff0c 如何使用你清楚了吗 xff1f 今天就来一探究竟 xff0c 扫清疑惑 实验
  • 【算法学习】二分查找 binary-search (Java 参考)

    题目描述 给定一个 n 个元素有序的 xff08 升序 xff09 整型数组 nums 和一个目标值 target xff0c 写一个函数搜索 nums 中的 target xff0c 如果目标值存在返回下标 xff0c 否则返回 1 思路