LeetCode 34在排序数组中查找元素的第一个和最后一个位置

ops/2024/11/20 15:33:50/

LeetCode 34在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组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]

题解

二分查找

由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程。

考虑target开始和结束位置,其实我们要找的就是数组中「第一个等于 target的位置」(记为 leftIdx)和「第一个大于target的位置减一」(记为rightIdx)。

二分查找中,寻找leftIdx即为在数组中寻找第一个大于等于target于的下标,寻找rightIdx即为在数组中寻找第一个大于target的下标,然后将下标减一。两者的判断条件不同,为了代码的复用,我们定义binarySearch(nums, target, lower)表示在nums数组中二分查找target的位置,如果lowertrue,则查找第一个大于等于target的下标,否则查找第一个大于target的下标。

最后,因为target可能不存在数组中,因此我们需要重新校验我们得到的两个下标leftIdxrightIdx,看是否符合条件,如果符合条件就返回[leftIdx,rightIdx],不符合就返回[−1,−1]

python">from typing import Listclass Solution:# lower标志来决定找的是左侧边界还是右侧边界def binary_search(self, nums: List[int], target: int, lower: bool) -> int:left, right = 0, len(nums) - 1ans = len(nums)while left <= right:mid = (left + right) // 2if nums[mid] > target or (lower and nums[mid] >= target):right = mid - 1ans = midelse:left = mid + 1return ansdef search_range(self, nums: List[int], target: int) -> List[int]:left_idx = self.binary_search(nums, target, True)right_idx = self.binary_search(nums, target, False) - 1if left_idx <= right_idx and right_idx < len(nums) and nums[left_idx] == target and nums[right_idx] == target:return [left_idx, right_idx]else:return [-1, -1]# 示例调用
solution = Solution()
nums = [5, 7, 7, 8, 8, 10]
target = 8
result = solution.search_range(nums, target)
print(result)

输出:

python">[3, 4]

http://www.ppmy.cn/ops/4349.html

相关文章

数仓建模—物理数据模型

数仓建模—物理数据模型 前面我们讲了数据模型和逻辑数据模型,你可以参考前面的文章,这一节我们介绍一下物理数据模型 数仓建模—数据模型 数仓建模—逻辑数据模型 什么是物理数据模型 物理数据模型指定如何在数据库中构建数据模型。它概述了所有表结构,包括列名、数据类…

logrotate命令

logrotate是linux系统中用来简化系统日志管理的工具&#xff0c;在系统运行过程中会产生大量日志&#xff0c;可以使用该工具来对日志进行管理。logrotate能够自动对日志文件进行轮询、压缩、移除和发送邮件&#xff0c;所有的操作可以在固定的时间间隔如每天、每周、每月执行&…

微信小程序-长按显示,点击空白区域关闭

<view bind:tap"closeLongAction"><view bind:longpress"openAction></view><view wx:if"{{longActionIsShow}}"> 长按显示的区域 </view> </view>openAction(e) {console.log(322,e);this.setData({longActionI…

m4p转换mp3格式怎么转?3个Mac端应用~

M4P文件格式的诞生伴随着苹果公司引入FairPlay版权管理系统&#xff0c;该系统旨在保护音频的内容。M4P因此而生&#xff0c;成为受到FairPlay系统保护的音频格式&#xff0c;常见于苹果设备的iTunes等平台。 MP3文件格式的多个优点 MP3格式的优点显而易见。首先&#xff0c;其…

搜维尔科技:SenseGlove 的 Nova 被用于组装卫星接收器的虚拟现实培训项目中

SenseGlove 的 Nova 被用于组装卫星接收器的虚拟现实培训项目中 搜维尔科技&#xff1a;SenseGlove 的 Nova 被用于组装卫星接收器的虚拟现实培训项目中 得益于 SenseGlove 的力反馈专利&#xff0c;学员可以感受到他们正在组装的零件的形状、尺寸和密度。学员可以通过运动跟踪…

Playwright UI 自动化测试实战

随着软件开发的日益复杂和用户期望的不断提高&#xff0c;UI&#xff08;用户界面&#xff09;自动化测试变得越来越重要。Playwright是一个开源的自动化测试工具&#xff0c;可以用于测试Web应用程序&#xff0c;支持多种浏览器&#xff0c;并提供强大的自动化测试功能。本文将…

vagrant 安装虚拟机,docker, k8s

第一步&#xff1a;安装虚拟机 1、安装 vagrant 本机是 mac, 但是这一步不影响&#xff0c;找对应操作系统的安装方式就行了。 vagrant 下载地址 brew install vagrant 2、下载 VirtualBox 虚拟机 VirtualBox 下载地址 找到对应系统下载&#xff0c;安装就可以。 尽量把…

FMC总线应用控制32路高速IO扩展

FMC总线应用控制32路高速IO扩展 FMC的块区分配举例扩展IO驱动LED应用FMC驱动配置MPU配置扩展IO配置FMC并口访问时序应用 仅供个人学习&#xff0c;来源于armfly。 为什么要做 IO 扩展&#xff0c;不是已经用了 240 脚的 H743XIH6 吗&#xff1f;因为开发板使用了 32 位 SDRAM 和…