码随想录算法训练营第一天| 【数组】704. 二分查找法

704.二分查找

题目

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

注意

题干要素

  1. 有序数组
  2. 无重复数组

阶梯注意事项

区间不变
区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

解法

左闭右闭

class Solution:def search(self, nums: List[int], target: int) -> int:left, right = 0, len(nums) - 1  # 定义target在左闭右闭的区间里,[left, right]while left <= right:middle = left + (right - left) // 2# middle = (left+right)// 2if nums[middle] > target:right = middle - 1  # target在左区间,所以[left, middle - 1]elif nums[middle] < target:left = middle + 1  # target在右区间,所以[middle + 1, right]else:return middle  # 数组中找到目标值,直接返回下标return -1  # 未找到目标值

左闭右开

class Solution:def search(self, nums: List[int], target: int) -> int:left, right = 0, len(nums)  # 定义target在左闭右开的区间里,即:[left, right)while left < right:  # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <middle = left + (right - left) // 2if nums[middle] > target:right = middle  # target 在左区间,在[left, middle)中elif nums[middle] < target:left = middle + 1  # target 在右区间,在[middle + 1, right)中else:return middle  # 数组中找到目标值,直接返回下标return -1  # 未找到目标值

其他题解

解题思路

「二分查找」是利用数组的有序性,每轮缩窄一半的查找区间(即排除一半元素),直到找到目标值或查找区间为空时返回。

由于每轮可以排除一半元素,因此查找最多循环 log 2 N 次,时间复杂度 O(logN) 。在数据量较大时,「二分查找 O(logN) 」效率大幅高于「线性查找 O(N) 」。

理解二分查找的关键是理解缩窄区间的含义。给定升序数组 nums 和目标值 target ,二分查找流程如下:

定义查找区间: 初始化双指针 i , j 分别指向数组首、尾元素,代表查找区间为闭区间 [i,j] ;

循环二分,缩窄查找区间:

使用向下取整除法,计算区间 [i,j] 的中点 m ;

若 nums[m]<target ,根据数组有序性,易得 target 一定不在闭区间 [i,m] 中,因此执行 i=m+1 ,即将查找区间缩窄至 [m+1,j] ;

若 nums[m]>target , 根据数组有序性,易得 target 一定不在闭区间 [m,j] 中,因此执行 j=m−1 ,即将查找区间缩窄至 [i,m−1] ;

若 nums[m]=target ,说明找到 target ,返回索引 m 即可;

不满足 i≤j 时跳出循环,此时代表无法在数组中找到 target ,因此返回 −1 ;

复杂度分析

时间复杂度 O(logN) : 其中 N 为数组 nums 长度。二分查找使用对数级别时间。
空间复杂度 O(1) : 变量 left , right 使用常数大小空间。

参考:

  • https://leetcode.cn/problems/binary-search/solutions/1692151/by-jyd-i7xr
  • 代码随想录 https://programmercarl.com

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

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

相关文章

Python容器 之 练习题

1.字符串的基本使用 # 定义一个字符串 str1, 字符串的内容为 "hello world and itcast and itheima and Python" str1 "hello world and itcast and itheima and Python" # 在字符串str1中查找 字符串 and 的下标 num str1.find(and) print(num) # 12…

直线旋转电机的分类有哪些?有何特点?

直线电机也被称为线性电机&#xff0c;线性马达&#xff0c;直线马达等&#xff0c;它是一种将电能直接转换成直线运动机械能&#xff0c;而不需要任何中间转换机构的传动装置。那么&#xff0c;直线旋转电机的分类有哪些&#xff1f;有何特点&#xff1f;接下来就让小编来为大…

MybatisPlus实现AES加密解密,实现yml配置文件中数据库连接信息如用户名,密码等信息加密解密

1 生成秘钥&#xff0c;使用AES工具生成一个随机秘钥&#xff0c;然后对用户名&#xff0c;密码加密 //数据库用户名和密码加密工具测试类 public class MpDemoApplicationTests {Testvoid contextLoads() {// 数据库用户名和密码String dbUsername"改成你的数据库连接用…

UE5 01-给子弹一个跟角色一致的向前的方向的冲量

默认Pawn 负责角色位置, 默认PlayerController 负责记录角色相机旋转

Perl 语言开发(三):运算符和表达式

目录 1. 算术运算符 1.1 基本算术运算符 1.2 自增和自减运算符 2. 字符串运算符 2.1 连接运算符 2.2 重复运算符 3. 赋值运算符 3.1 简单赋值运算符 3.2 复合赋值运算符 4. 比较运算符 4.1 数字比较运算符 4.2 字符串比较运算符 5. 逻辑运算符 5.1 逻辑运算符 5…

java过滤器和拦截器(Filter,Interceptor)

1、过滤器 import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException;public…

ARXML(AUTOSAR XML)

用m语言检查Arxml文件的连线问题-CSDN博客 什么是ARXML文件&#xff1f; ARXML&#xff08;AUTOSAR XML&#xff09;是AUTOSAR&#xff08;AUTomotive Open System ARchitecture&#xff09;标准中定义的一种XML格式的文件&#xff0c;用于描述汽车电子系统的软件和硬件架构。…

品牌推广好做吗?掌握技巧和方法,流程也需精通!

很多人说品牌推广太难做&#xff0c;不仅花钱多&#xff0c;而且没效果。我想说&#xff0c;那是你们方法错了。 我自己就有一家手工酸奶品牌&#xff0c;不仅没花广告钱&#xff0c;而且全国复制了100多家门店。 这篇文章&#xff0c;就和大家详细说下&#xff0c;品牌推广需…

【区块链+基础设施】银联云区块链服务 | FISCO BCOS应用案例

为了顺应区块链基础设施化的发展趋势&#xff0c;中国银联推出了银联云区块链服务——UPBaaS&#xff0c;为金融行业采用区块链 技术提出了解决方案&#xff0c;微众银行为平台提供 FISCO BCOS 区块链开源技术支持。通过银联云区块链服务&#xff0c;用户可 以用可视化的方式创…

再回首,什么是人工智能?

文章目录 一、说明二、什么是人工智能&#xff1f;三、人工智能的类型&#xff1a;弱人工智能与强人工智能四、深度学习与机器学习五、生成模型的兴起六、人工智能应用6.1 语音识别6.2 客户服务6.3 计算机视觉6.4 供应链6.5 天气预报6.6 异常检测 七、人工智能的历史&#xff1…

SQL DISTINCT关键字详解

SQL DISTINCT关键字详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQL中的DISTINCT关键字。DISTINCT是SQL语言中用来消除查询结果中重复…

瑞数信息:智能防护新时代,看AI如何筑起网络防线

AI时代&#xff0c;网络安全危与机并行。 尤其是近年来大火的大模型&#xff0c;对于网络安全行业的影响与其他行业有所不同&#xff0c;一方面&#xff0c;AI能够通过大幅降低了安全攻击的门槛&#xff0c;网络威胁的复杂性和多样性不断增加&#xff0c;如自动化攻击、零日漏…

仓库管理系统11--物资设置

1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.GoodsTypeView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxm…

WPF自定义模板--TreeView 实现菜单连接线

有些小伙伴说&#xff0c;在TreeView中&#xff0c;怎么每一个都加上连接线&#xff0c;进行显示连接。 代码和效果如下&#xff1a; 其实就是在原来的模板中增加一列显示线条&#xff0c;然后绘制即可 <Window x:Class"XH.TemplateLesson.TreeViewWindow"xmln…

ArcGIS Pro SDK (七)编辑 8 操作栅格字段

ArcGIS Pro SDK &#xff08;七&#xff09;编辑 8 操作栅格字段 目录 ArcGIS Pro SDK &#xff08;七&#xff09;编辑 8 操作栅格字段1 从栅格字段读取2 将图像写入栅格字段3 将压缩图像写入栅格字段 环境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 从栅格…

nrm,nvm日常使用

开发node.js的时候,经常会遇到某些包无法下载, 或者下载太慢, 还有需要加载我们自己是有源中的包的问题, nrm 镜像源管理工具就是解决这类问题的 // 安装nrm npm install nrm -g // 添加源 nrm add evoc http://xxxx // 使用源 nrm use evoc // nrm ls 查看所有源npm ------…

Java基础之基本数据类型与String

语法基础 8种基本数据类型 基本类型是不同于类(Class)的特殊类型&#xff0c;在栈内存中管理 字符型 char 布尔型 boolean 数值型 不存在无符号的整型&#xff0c;范围也是固定的与环境无关 整型 byte 一个字节存储&#xff0c;范围-128~127&#xff0c;初始化时默认为0sho…

【SVN的使用-源代码管理工具-SVN介绍-服务器的搭建 Objective-C语言】

一、首先,我们来介绍一下源代码管理工具 1.源代码管理工具的起源 为什么会出现源代码管理工具,是为了解决源代码开发的过程中出现的很多问题: 1)无法后悔:把项目关了,无法Command + Z后悔, 2)版本备份:非空间、费时间、写的名称最后自己都忘了干什么的了, 3)版本…

易保全推动区块链应用与AI融合创新发展

数字化时代&#xff0c;区块链和人工智能技术作为当下两大“黑科技”&#xff0c;两者的深度结合&#xff0c;正在为企业数字化转型带来前所未有的机遇。 易保全作为国内权威的电子数据存证保全机构&#xff0c;积极探索两者的融合之道&#xff0c;将区块链的去中心化、不可篡…

【Threejs进阶教程-着色器篇】2. Uniform的基本用法与Uniform的调试

Uniform的基本用法与Uniform的调试 关于本Shader教程优化上一篇的效果优化光栅栏高度让透明度和颜色变的更平滑pow()函数借助数学工具更好的理解函数 Unifoms简介编写uniforms修改片元着色器代码借助lil.gui调试uniforms使用uniform控制颜色继续在uniforms添加颜色在着色器中接…