【代码随想录 | 数组 01】二分查找

news2025/1/16 17:56:58

在这里插入图片描述

文章目录

  • 1.二分查找
    • 1.1题目
    • 1.2思路(核心:区间的定义)
    • 1.3左闭右闭
    • 1.4左闭右开
    • 1.5总结

1.二分查找

1.1题目

704.二分查找—力扣题目链接

  • 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
  • 示例一:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
  • 示例二:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

1.2思路(核心:区间的定义)

  1. 题目的前提是数组为有序数组,同时题目还强调 数组中无重复元素
  2. 因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。

1.3左闭右闭

  • 定义target在 [left, right] 区间,所以有如下两点:
  1. while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  2. if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
  3. 下面举例演示:在一组有序,不重复数组中分别查找数据2、数据6的过程

image-20240310152650608

/**
     * @Description 二分查找第一种写法:左闭右闭
     * @Param
     * @Return 下标值:int
     */
    public int binarySearch1(int[] arr,int target){
        int left=0;
        int right=arr.length-1;
        while(left<=right){
            /**
             *  写法一:可能出现溢出情况
             *      int mid=(left+right)/2;
             *  写法二:
             *      int mid=left+(right-left)/2;
             */
            //写法三:右移运算符 代替 除号
            int mid=left+((right-left)>>1);
            if(arr[mid]>target){        //在左区间,即[left,mid-1]
                right=mid-1;
            }else if(arr[mid]<target){  //在右区间,即[mid+1,right]
                left=mid+1;
            }else{
                return mid;
            }
        }
        return -1;
    }
  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

1.4左闭右开

如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。

  1. while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  2. if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]大于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]

image-20240310155356483

  • 代码示例:
	/**
     * @Description 二分查找第一种写法:左闭右闭
     * @Param
     * @Return 下标值:int
     */
    public int binarySearch2(int[] arr,int target){
        int left=0;
        int right=arr.length;
        while(left<right){
            
            int mid=left+((right-left)>>1);
            if(arr[mid]>target){        //在左区间,即[left,mid-1)
                right=mid;
            }else if(arr[mid]<target){  //在右区间,即[mid+1,righ)
                left=mid+1;
            }else{
                return mid;
            }
        }
        return -1;
    }
  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

1.5总结

  • 使用二分查找的两个前提:
    • 数组有序
    • 数组元素唯一,不重复
  • 二分查找的两个写法区分:
左闭右闭左闭右开
right初始取值right=arr.length-1right=arr.length
循环条件while(left<=right)while(left<right)
left更新值(到右区间查找)left=mid+1left=mid+1
right更新值(到左区间查找)right=mid-1right=mid

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java毕业设计-基于spring boot开发的实习管理系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、前台功能模块2、后台功能模块2.1 管理员功能2.2 教师功能2.3 学生功能2.4 实习单位功能 四、毕设内容和源代码获取总结 Java毕业设…

外贸产品再好,推广不出去也白搭!

外贸产品虽然质量和价格都很好&#xff0c;但是如果没有推广的支持&#xff0c;就很难在市场上打开局面。好的产品需要好的营销&#xff0c;推广不仅仅是宣传产品的重要手段&#xff0c;更是提高产品知名度和市场占有率的关键。只有通过有效的推广措施&#xff0c;才能让产品赢…

(Linux学习九)管道、重定向介绍

FD:文件描述符。 0,1,2,3&#xff0c;&#xff0c;&#xff0c;。进程打开文件所用。 0标准输入 1 标准输出 2 标准错误输出 3普通文件 一、管道 | 命令 | tee | xargs | 命令1的输出&#xff0c;作为命令2的输入&#xff0c;命令2的输出作为命令3的输入 | tee 三通&#xff…

【Python】random库

专栏文章索引&#xff1a;Python 原文章&#xff1a;Python中random函数用法整理_python random-CSDN博客 目录 1.random.random() 2.random.uniform(a, b) 3.random.randint(a, b) 4.random.randrange([start], stop[, step]) 5. random.choice() 6. random.shuffle(x[,…

工业园区智慧水电设备管控系统

在现代工业园区中&#xff0c;水电设备的管控系统起着至关重要的作用。这些系统不仅仅是简单的机械装置&#xff0c;它们更是一种智慧的结合&#xff0c;为工业生产提供了可靠的保障和高效的管理。让我们一起来探索工业园区智慧水电设备管控系统的奥秘。 我们来看看水电设备的…

电脑内存条

目录 一&#xff0c;电脑内存条是什么1&#xff0c;定义2&#xff0c;作用 二&#xff0c;怎样查看自己电脑内存条1&#xff0c;window运行管理器2&#xff0c;软件3&#xff0c;intel官网4&#xff0c;计算机命令行模式 三&#xff0c;选择电脑内存条1&#xff0c;选择ddr2&am…

如何在WordPress网站上设置多语言展示

在今天的全球化世界中&#xff0c;拥有多语言网站对于吸引更广泛的受众至关重要。前不就我们遇到Hostease的客户咨询我们的在线客服&#xff0c;他想要对他的wordpress网站支持多语言。我们提供给客户可以尝试以下的插件来支持多语言。 在本教程中&#xff0c;我们将逐步介绍如…

蓝桥杯-Python组(一)

1. 冒泡排序 算法步骤&#xff1a; 比较相邻元素&#xff0c;如果第一个大于第二个则交换从左往右遍历一遍&#xff0c;重复第一步&#xff0c;可以保证最大的元素在最后面重复上述操作&#xff0c;可以得到第二大、第三大、… n int(input()) a list(map(int, input()…

a-table:实现跨域多选功能——基础积累

table组件跨页多选功能&#xff1a; html部分的代码&#xff1a; <a-tablesize"small"style"margin-top: 10px"rowKey"id":columns"columns":dataSource"dataSource":pagination"pagination":loading"l…

从菜鸟到大师!年薪20W的c++ QT开发工程师需要懂哪些技术?

如今Qt的知识也变得非常广泛和复杂&#xff0c;学习起来同样具有一定的挑战。对于Qt从业者来说&#xff0c;有两个主要层面&#xff1a;一个是深入理解Qt框架和基础知识&#xff0c;另一个是具备丰富的工程经验。 还不熟悉的朋友&#xff0c;这里可以先领取一份Qt开发必备技术…

亏本买卖愿意做?济公活佛教你活!向前一步是正轨!——早读(逆天打工人爬取热门微信文章解读)

你愿意亏本卖你的产品吗&#xff1f; 引言Python 代码第一篇 人民日报 【夜读】亲爱的娃娃们&#xff0c;这篇演讲献给春天&#xff0c;献给你第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 人生不止眼前的山顶&#xff0c;更在沿途攀登的风景 不妨怀揣“上一山&#xff0…

fs模块 文件写入 之 追加写入

文件的同步、异步追加写入&#xff1a; 一、异步追加 &#xff08;1&#xff09;语法&#xff1a;fs.appendFile(path,data,[options],callback(data,err)) &#xff08;2&#xff09;操作 1》引入fs模块 const fsrequire(fs); 2》调用appendFile fs.appendFile(./我可以…

18、设计模式之解释器模式(Interpreter)

一、什么是解释器模式 解释器模式是一种行为型设计模式。解释器模式就像是一种自定义语言&#xff0c;我们可以定义该语言的语法规则&#xff0c;然后从中解析出具体的命令或表达式&#xff0c;最终执行相应的操作。 eg&#xff1a;这种模式比较冷门&#xff0c;不怎么使用。 …

【安卓】Android开发入门 你的第一个apk应用

本文介绍如何写一个入门的安卓apk应用, 以嵌套一个网页为例。 开发ide&#xff1a;Android studio 语言&#xff1a;Kotlin tips: 最好别下载新版本的 Android studio &#xff0c;因为新版的界面有所改动 遇到问题去网上搜 新手刚入门可能界面都找不到在哪里&#xff1b;其次…

UI设计中的图标的分类,功能性图标

图标的分类 既然知道了图标的作用和重要性&#xff0c;那么接下来&#xff0c;就要进一步了解在工作中我们要设计哪些图标。图标可以划分成三种大类:功能性图标、装饰性图标、启动图标。 功能性图标 功能图标是具有指代意义且具有功能标识的图形&#xff0c;它不仅是一种图形&a…

vue.js 页面中设置多个swiper

效果&#xff1a; 设置主要设置了 动态的 包含类、 左右按钮的类 <template><div class"swiper-container_other"><!-- 右侧按钮 --><div :class"[(id)?swiper-button-nextid:swiper-button-next, swiper-button-next]"></div…

阿里云数据盘挂载目录

1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了&#xff0c;您根据您需求删除快照就行&#xff0c; 然后登录服务器内执行&#xff1a; fdisk -l lsblk blkid ll /aaa 3、执行&#xff1a;&#xff08;以下命令是进行数据盘做ext4文件系统并挂载到…

北京市办理大兴道路运输许可证所需条件及注意事项

尊敬的客户&#xff1a; 感谢您选择北京经典世纪集团有限公司作为您的信任合作伙伴。我们从多个角度&#xff0c;为您详细解析办理大兴道路运输许可证所需的条件及注意事项&#xff0c;以便您轻松高效地完成相关手续。&#xff08;游览器搜经典世纪胡云帅&#xff09;。 我们…

旧物置换网站|基于springboot+ Mysql+Java+B/S架构的旧物置换网站设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 注册登录界面 个人中心 用户功能模块 管理员功能登录前台功能效果图 卖家功能…

华为三层交换机:ACL的基本实验

实验要求&#xff1a; PC1不允许访问PC3&#xff0c;PC3可以访问PC1 分析问题&#xff1a; PC1不允许访问PC3&#xff0c;问题中含有“目标地址”则我们需要设置目标地址&#xff0c;这样基本ACL是不行的&#xff0c;必须使用高级ACL [sw1]acl ? INTEGER<2000-2999>…