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

在这里插入图片描述

文章目录

  • 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.hqwc.cn/news/535199.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2 - Card Identification

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2 - Card Identification 一、问题回顾二、本次的任务三、 需要注意的问题3.1 Card Identification Mode时的时钟频率3.2 CMD0指令的疑似问题3.3 发送带参数的ACMD41时要注意时间时序和时效3.4 CPSM的指令发送问题…

Python循环语句全解析(附实战演练)

目录 1. for 循环 2. while循环 3. 简单语句组 4. for...else语句 5. while ...else 语句 6. range() 函数 7. break & continue语句 8. 循环中的 else 子句 9. pass语句 10. 实战练习&#xff1a; 结语 前面学习了Python的六大数据类型、Python条件语句&#x…

Leetcode101对称的二叉树

如何去检查对称&#xff1f; 思路是check(n1->left,n2->right)&&check(n1->right,n2->left) 直接手算这题&#xff0c;该懂就懂了&#xff01; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* Tre…

操作系统内功篇:硬件结构之CPU是如何运行的?

本文分5个小结&#xff0c;分别是图灵机工作方式&#xff0c;冯诺依曼结构&#xff0c;总线线路位宽和CPU位宽&#xff0c;程序执行的基本过程&#xff0c; a12的具体执行过程。 一 图灵机的工作方式 图灵机由纸带&#xff0c;读写头组成。读写头上有一些部件例:存储单元&#…

【报错 - npm包问题】 token.type.endsWith is not a function

将 babel-eslint 10.1.0版本&#xff0c;降为 8.2.2 npm install babel-eslint8.2.2 --save

Python编程从入门到实践中的一些误区

1.num 使用num时python报错&#xff0c;后来查过后才知道是因为python不支持自增或自减&#xff0c;可以用1。 2.字符串和非字符串连接 要先将非字符串转换为字符串类型之后才能连接 print&#xff08;2int&#xff08;‘2’&#xff09;&#xff09;#4 3.关键字参数必须在未…

【Paper Reading】7.DiT(VAE+ViT+DDPM) Sora的base论文

VAE DDPM 分类 内容 论文题目 Scalable Diffusion Models with Transformers 作者 William Peebles (UC Berkeley), Saining Xie (New York University) 发表年份 2023 摘要 介绍了一类新的扩散模型&#xff0c;这些模型利用Transformer架构&#xff0c;专注于图像生…

Maya自定义工具架

有时候我们需要自己定义工具架上的内容&#xff0c;比如将一个工具放到工具架上&#xff0c;或者删除一个工具 添加一个工具 例如我们想在多边形建模栏位上添加一个分离按钮&#xff0c;默认 1 先切换到想要添加的工具架栏位 2 打开菜单&#xff0c;找到我们想添加的工具 …

Jmeter - 从入门到精通 - 环境搭建(详解教程)

一、JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序&#xff0c;被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能&#xff0c;例如&#xff1a;静态文件&#xff0c;Java Servlet,CGI Scripts,Java Object,数据库和FTP服…

SM4加密是什么?SM4算法在国密HTTPS协议中的作用

SM4算法&#xff0c;全称为“国密SM4分组密码算法”&#xff0c;是国家密码管理局颁布的一种对称加密算法它是我国商用密码体系中的重要组成部分。与国际上广泛使用的AES等算法类似&#xff0c;SM4同算法样用于保护数据的机密性&#xff0c;确保信息在传输过程中不被未授权的第…

中东斋月将近,外贸业务要抓紧了!

Question.1 斋月所涉及的国家有哪些? 据统计&#xff0c;共计有48个国家会恭迎斋月的到来&#xff0c;集中分布于亚洲西部和非洲北部。其中黎巴嫩、乍得、尼日利亚、波黑和马来西亚只有约一半的人信仰伊斯兰教。 阿拉伯国家(22个) 亚洲&#xff1a;科威特、伊拉克、叙利亚、…

250+可用的 AI 资源网站

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 这里是关于AI网站的一份资源列表。欢迎访问该链…