LeetCode题解:34.在排序数组中查找元素的第一个和最后一个位置【Python题解超详细,二分查找法、index法】,知识拓展:index方法详解

题目描述

        给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

解答

class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# # 思路一:二分查找法# # 特殊情况,直接返回 [-1, -1]# if not nums or target not in nums:#     return [-1, -1]# # 获取数组的长度# n = len(nums)# # 初始化二分查找的左右边界# left, right = 0, n - 1# # 二分查找目标值# while left <= right:#     # 计算中间元素的索引#     mid = (left + right) // 2              #     # 如果找到了目标值#     if nums[mid] == target:#         # 从中间位置开始,扩展查找最左边界和最右边界#         l1, r1 = mid, mid#         # 向左扩展,找到目标值的最左位置#         while l1 > 0 and nums[l1 - 1] == target:#             l1 -= 1#         # 向右扩展,找到目标值的最右位置#         while r1 < n - 1 and nums[r1 + 1] == target:#             r1 += 1#         # 返回最左和最右位置#         return [l1, r1]  #     # 根据目标值与中间值的大小关系调整查找区间#     if target < nums[mid]:#         right = mid - 1  # 目标值小于中间值,向左查找#     else:#         left = mid + 1  # 目标值大于中间值,向右查找# # 如果没有找到目标值,返回 [-1, -1]# return [-1, -1]# 思路二:index法if not nums or target not in nums:return [-1, -1]# 获取数组的长度n=len(nums)left=nums.index(target)right=leftwhile right<n-1 and nums[right+1]==target:right+=1return [left,right]

      思路一:二分查找法

        该方法通过二分查找在排序数组中找到目标值 target 的任意位置,然后从该位置向左右两侧扩展,分别查找目标值的最左端最右端。这种方法的优势在于利用了二分查找的高效性,时间复杂度为 O(log n),但扩展左右边界时会使用线性扫描,因此在某些情况下可能降低效率。

        思路二:index 查找法

        使用 Python 内建的 index() 方法找到目标值的第一个出现位置,然后通过向右扩展扫描,找出目标值的最右端位置。这种方法简洁直观,但它的时间复杂度较高,最坏情况下是 O(n),尤其是在目标值出现多次时,因为需要对数组进行遍历。此方法适用于目标值较少重复的场景。

知识拓展:index方法

        Python 中的 index() 方法用于查找一个元素在列表(或其他可迭代对象)中的 第一个 索引位置。如果该元素不存在,index() 会引发一个 ValueError 异常(这也是为什么在上一篇题解的代码中使用了 except ValueError)。它通常用于查找元素在列表中的索引,能够简化代码实现,但在某些场景下使用不当会导致性能问题。

1. 基本用法

index() 方法的基本语法如下:

list.index(element, start=0, end=len(list))
  • element:要查找的元素。
  • start(可选):开始查找的位置,默认为 0。
  • end(可选):结束查找的位置,默认为列表的长度 len(list)

返回值是 元素在列表中第一次出现的索引,如果元素不在列表中,会引发 ValueError 异常。

2. 示例
# 示例 1:查找元素在列表中的索引
lst = [10, 20, 30, 40, 50]
index = lst.index(30)
print(index)  # 输出: 2# 示例 2:指定 start 和 end 参数
index = lst.index(30, 2, 5)  # 从索引 2 到 5 查找
print(index)  # 输出: 2# 示例 3:元素不存在会抛出 ValueError
try:index = lst.index(100)
except ValueError:print("元素不存在")
3. 参数详解
  • element:查找目标元素。
  • start:可选的查找起始位置,默认为 0,即从列表头部开始查找。如果指定了 start,则会从指定的索引位置开始查找。
  • end:可选的查找结束位置,默认为 len(list),即列表的末尾。如果指定了 end,查找会限制在从 startend 的范围内。
4. 性能分析
  • 时间复杂度index() 方法的时间复杂度是 O(n),其中 n 是列表的长度。最坏情况下,index() 需要遍历整个列表来找到目标元素。因此,当列表很大时,使用 index() 方法查找元素的效率较低,尤其在元素不存在或者出现在列表末尾时。

  • 空间复杂度O(1),只需要常数空间。

5. 常见场景
  • 查找元素的第一个出现位置:当你需要查找列表中某个元素第一次出现的位置时,index() 方法非常方便。

  • 在已知元素存在的情况下:当你确定目标元素一定存在于列表中时,使用 index() 方法能够快速得到元素的位置。

  • 查找位置并作进一步处理:在一些情况下,我们希望知道一个元素在列表中的位置,以便后续处理。比如在排序数组中查找某个元素的位置。

6. index()in 操作符
  • index() 方法与 in 操作符的区别在于,in 判断元素是否存在于列表中时,不会抛出异常,而 index() 查找元素时,如果元素不存在会引发 ValueError 异常。

    • in 操作符:用于检查元素是否在列表中,返回布尔值 TrueFalse
    • index() 方法:返回元素的索引位置,如果元素不存在则抛出异常。
lst = [10, 20, 30]# 使用 'in' 判断元素是否存在
if 20 in lst:print("20 存在于列表中")  # 输出: 20 存在于列表中# 使用 index() 查找元素的位置
try:index = lst.index(20)print("20 的索引位置:", index)  # 输出: 20 的索引位置: 1
except ValueError:print("元素不存在")# 如果元素不存在,'in' 返回 False,而 index() 会抛出异常
if 40 in lst:print("40 存在于列表中")
else:print("40 不在列表中")  # 输出: 40 不在列表中try:index = lst.index(40)  # 抛出 ValueError
except ValueError:print("40 不在列表中")  # 输出: 40 不在列表中

感谢阅读,希望对你有所帮助~

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

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

相关文章

【博主推荐】C#中winfrom开发常用技术点收集

文章目录 前言1.打开文件夹并选中文件2.窗体之间传参3.异步调用&#xff1a;让数据处理不影响页面操作4.创建一个多文档界面(MDI) 应用程序5.在WinForms中使用数据绑定6.在WinForms中后台使用控件的事件处理7.在WinForms中窗体跳转的几种方式8.后台处理方法中&#xff0c;调用窗…

Matlab 绘制雷达图像完全案例和官方教程(亲测)

首先上官方教程链接 polarplothttps://ww2.mathworks.cn/help/matlab/ref/polarplot.html 上实例 % 定义角度向量和径向向量 theta linspace(0, 2*pi, 5); r1 [1, 2, 1.5, 2.5, 1]; r2 [2, 1, 2.5, 1.5, 2];% 绘制两个雷达图 polarplot(theta, r1, r-, LineWidth, 2); hold …

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

响应式编程一、Reactor核心

目录 一、前置知识1、Lambda表达式2、函数式接口 Function3、StreamAPI4、Reactive-Stream1&#xff09;几个实际的问题2&#xff09;Reactive-Stream是什么&#xff1f;3&#xff09;核心接口4&#xff09;处理器 Processor5&#xff09;总结 二、Reactor核心1、Reactor1&…

Docker for Everyone Plus——No Enough Privilege

直接告诉我们flag在/flag中&#xff0c;访问第一小题&#xff1a; sudo -l查看允许提权执行的命令&#xff1a; 发现有image load命令 题目指明了有rz命令&#xff0c;可以用ZMODEM接收文件&#xff0c;看到一些write up说可以用XShell、MobaXterm、Tabby Terminal等软件连接上…

深度学习基础2

1.损失函数 1.1 线性回归损失函数 1.1.1 MAE损失 MAE&#xff08;Mean Absolute Error&#xff0c;平均绝对误差&#xff09;通常也被称为 L1-Loss&#xff0c;通过对预测值和真实值之间的绝对差取平均值来衡量他们之间的差异。。 公式&#xff1a; 其中&#xff1a; n 是样…

【Android】组件化嘻嘻嘻gradle耶耶耶

文章目录 Gradle基础总结&#xff1a;gradle-wrapper项目根目录下的 build.gradlesetting.gradle模块中的 build.gradlelocal.properties 和 gradle.properties 组件化&#xff1a;项目下新建一个Gradle文件定义一个ext扩展区域config.gradle全局基础配置&#xff08;使用在项目…

基础Web安全|SQL注入

基础Web安全 URI Uniform Resource Identifier&#xff0c;统一资源标识符&#xff0c;用来唯一的标识一个资源。 URL Uniform Resource Locator&#xff0c;统一资源定位器&#xff0c;一种具体的URI&#xff0c;可以标识一个资源&#xff0c;并且指明了如何定位这个资源…

【插入排序】:直接插入排序、二分插入排序、shell排序

【插入排序】&#xff1a;直接插入排序、二分插入排序、shell排序 1. 直接插入排序1.1 详细过程1.2 代码实现 2. 二分插入排序2.1 详细过程2.2 代码实现 3. shell排序3.1 详细过程3.2 代码实现 1. 直接插入排序 1.1 详细过程 1.2 代码实现 public static void swap(int[]arr,…

一万台服务器用saltstack还是ansible?

一万台服务器用saltstack还是ansible? 选择使用 SaltStack 还是 Ansible 来管理一万台服务器&#xff0c;取决于几个关键因素&#xff0c;如性能、扩展性、易用性、配置管理需求和团队的熟悉度。以下是两者的对比分析&#xff0c;帮助你做出决策&#xff1a; SaltStack&…

通讯专题4.1——CAN通信之计算机网络与现场总线

从通讯专题4开始&#xff0c;来学习CAN总线的内容。 为了更好的学习CAN&#xff0c;先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中&#xff0c;有许多的网络&#xff0c;如交通网&#xff08;铁路、公路等&#xff09;、通信网&#xff08;电信、…

使用OSPF配置不同进程的中小型网络

要求&#xff1a; 给每个设备的接口配置好相应的地址 对进程1的各区域使用认证&#xff0c;认证为明文发送&#xff0c;明文保存 对骨干区域使用接口认证&#xff0c;非骨干区域使用区域认证 其他ospf进程均使用区域0 FW1上配置接口信任域和非信任域和服务器&#xff0c…

软考高项经验分享:我的备考之路与实战心得

软考&#xff0c;尤其是信息系统项目管理师&#xff08;高项&#xff09;考试&#xff0c;对于众多追求职业提升与专业认可的人士来说&#xff0c;是一场充满挑战与机遇的征程。我在当年参加软考高项的经历&#xff0c;可谓是一波三折&#xff0c;其中既有成功的喜悦&#xff0…

Transformers在计算机视觉领域中的应用【第1篇:ViT——Transformer杀入CV界之开山之作】

目录 1 模型结构2 模型的前向过程3 思考4 结论 论文&#xff1a; AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 代码&#xff1a;https://github.com/google-research/vision_transformer Huggingface&#xff1a;https://github.com/huggingf…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能&#xff0c;自己研究了下。 1.其中向量角度计算&#xff1a; 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向&#xff0c;从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

蓝桥杯第 23 场 小白入门赛

一、前言 好久没打蓝桥杯官网上的比赛了&#xff0c;回来感受一下&#xff0c;这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …

从0开始学PHP面向对象内容之常用设计模式(享元)

二、结构型设计模式 7、享元模式&#xff08;Flyweight Pattern&#xff09; 这里是引用享元模式&#xff08;Flyweight Pattern&#xff09; 是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;尤其适用于大量相似对象的场景。通过共享和重用对象的…

YOLO 标注工具 AutoLabel 支持 win mac linux

常见的标注工具&#xff0c;功能基础操作繁琐&#xff0c;无复制粘贴&#xff0c;标签无法排序修改&#xff0c;UI不美观&#xff0c;bug修正不及时&#xff0c;没有集成识别、训练、模型导出… 怎么办呢&#xff1f;AutoLabel它来了 Quick Start 一图胜千言 图像标注 支持YOL…

《Python基础》之Python中可以转换成json数据类型的数据

目录 一、JSON简介 JSON有两种基本结构 1、对象&#xff08;Object&#xff09; 2、数组&#xff08;Array&#xff09; 二、将数据装换成json数据类型方法 三、在Python中&#xff0c;以下数据类型可以直接转换为JSON数据类型 1、字典&#xff08;Dictionary&#xff09…

如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

文章目录 问题回答参考 问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成&#xff0c;并且当这其中任意一个子进程以非零退出码结束时&#xff0c;让该脚本也返回一个非零的退出码&#xff1f; 简单的脚本: #!/bin/bash for i in seq 0 9; docalculations $i & d…