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.mzph.cn/web/61558.shtml

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

相关文章

Cereal,一个轻量级的 C++ 序列化库!

嗨&#xff0c;大家好&#xff01;我是橙子。今天咱们来探索超棒的 Cereal 库&#xff0c;它能轻松搞定 C数据的序列化与反序列化&#xff0c;就像神奇的魔法&#xff0c;把数据变成能存储和传输的格式&#xff0c;然后又能变回来&#xff0c;超有趣哦&#xff01;快来开启学习…

理解Java集合的基本用法—Collection:List、Set 和 Queue,Map

本博文部分参考 博客 &#xff0c;强烈推荐这篇博客&#xff0c;写得超级全面&#xff01;&#xff01;&#xff01; 图片来源 Java 集合框架 主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集合&#xff08;单列…

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…

架构师:Dubbo 服务请求失败处理的实践指南

1、简述 在分布式服务中,服务调用失败是不可避免的,可能由于网络抖动、服务不可用等原因导致。Dubbo 作为一款高性能的 RPC 框架,提供了多种机制来处理服务请求失败问题。本文将介绍如何在 Dubbo 中优雅地处理服务请求失败,并结合具体实践步骤进行讲解。 2、常见处理方式 …

加载不同本地gltf模型,模型内容不更新的解决方案

相关链接 http://mars3d.cn/editor-vue.html?keyex_6_2_2&idlayer-graphic/draw/draw-model 问题内容 加载本地gltf模型的时候&#xff0c;不clear图层&#xff0c;再打开其他本地gltf&#xff0c;gltf的内容就不更新 重现步骤 进入官网示例&#xff0c;贴入以下代码…

LabVIEW实现串口调试助手

目录 1、串口通信原理 2、硬件环境部署 3、串口通信函数 4、程序架构 5、前面板设计 6、程序框图设计 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联…

云计算的发展历史与未来展望

云计算的起源与发展 云计算的概念最早可以追溯到20世纪60年代&#xff0c;当时的计算机科学家约翰麦卡锡&#xff08;John McCarthy&#xff09;提出了“按需提供计算能力”的构想。尽管这一理念在当时的技术条件下无法实现&#xff0c;但为云计算的未来发展奠定了理论基础。 …

【51单片机】程序实验910.直流电机-步进电机

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 码字不易&#xff0c;求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验9&10.直流电机-步进电机…

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令&#xff08;补充&#xff09; shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令&#xff08;补充&#xff09; …

如何把Qt exe文件发送给其他人使用

如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹&#xff0c;存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩&#xff0c;发送压缩包给别人 1、先把 Debug改成Release 2、重新构建项目 3、运行…

Kafka的消费消息是如何传递的?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka的消费消息是如何传递的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka的消费消息是如何传递的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;消息的消费是通过消费…

el-drawer如何实现增加resize拖曳改变宽度大小,通过小图标进行拖拽

请先看效果图 我主要是通过这个按钮来进行拖拽的&#xff0c;记住自行添加按钮图片 第一步 新建一个myDrawerDrag.js文件 import Vue from vueVue.directive(drawerDrag, {bind(el, binding, vnode, oldVnode) {const minWidth 400const dragDom el.querySelector(.el-drawe…

C#窗体简单登录

创建一个Windows登录程序&#xff0c;创建两个窗体&#xff0c;一个用来登录&#xff0c;一个为欢迎窗体&#xff0c;要求输入用户名和密码&#xff08;以个人的姓名和学号分别作为用户名和密码&#xff09;&#xff0c;点击【登录】按钮登录&#xff0c;登录成功后显示欢迎窗体…

Java基础全解:构建扎实编程技能

文章目录 1. Hello World 程序深入解析&#xff1a; 2. 数据类型深入解析&#xff1a; 3. 条件判断深入解析&#xff1a; 4. 循环结构深入解析&#xff1a; 5. 数组深入解析&#xff1a; 6. 方法定义与调用深入解析&#xff1a; 1. Hello World 程序 深入解析&#xff1a; 类…

开发规范:Restful风格

REST&#xff08;REpresentational State Transfer&#xff09;&#xff0c;表述性状态转换&#xff0c;它是一种软件架构的风格。这么说可能太过于专业&#xff0c;有些难以理解&#xff0c;不妨看个案例&#xff1a; 传统风格url 假如说我们需要使用传统风格url发起请求&am…

StarRocks-同步hive数据

官方文档对csv&#xff0c;orc ,json &#xff0c;parquet都支持的比较好。写文章的时候SR我们生产用的是3.1.x版本 1、同步hive表textfile格式的数据 hive表结构 CREATE EXTERNAL TABLE ads_d_app_rank_inc(filename string COMMENT 解析的文件名称,rank string COMMENT ap…

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数&#xff08;用户自定义函数&#xff09; 一般指的是用户自己定义的单行函数。一进一出&#xff0c;函数接受的是一行中的一个或者多个字段值&#xff0c;返回一个值。比如MySQL中的&#xff0c;日期相关的dateDiff函数&#xff0c;字符串相关的substring函数。 先…

详解Qt pdf 之QPdfSelection 选择文本类

文章目录 QPdfSelection 类详解前言 详细说明公共函数说明1. 构造函数2. text3. boundingRect4. isEmpty5. startPage6. endPage 使用场景示例代码代码说明总结 QPdfSelection 类详解 前言 QPdfSelection 是 Qt PDF 模块中的一个类&#xff0c;用于表示在 PDF 文档中被选中的…

记录部署dvwa靶场踩的几个坑

DVWA reCAPTCHA key: Missing 解决方法&#xff1a;网上随便copy一个&#xff0c;粘贴到config.inc.php配置文件里&#xff0c;具体我也是参考这篇文章的&#xff1a;DVWA下载、安装You dont have permission to access this resource.Server unable to read htaccess file, de…

linux——进程间通信及管道的应用场景

linux进程的控制-CSDN博客 liunx——进程间通信&#xff08;管道通信&#xff09;-CSDN博客 文章目录 文章目录 前言 二、管道的应用 1.创建子进程 1、描述&#xff1a; 2.创建进程及管理 3、子进程接受任务 4、控制子进程 总结 前言 上篇博客我们学习了进程间通信&…