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

news/2024/10/18 16:55:53/

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/news/1432234.html

相关文章

总结一下背包里的顺序和是否逆序

1.对于01背包而言&#xff0c;一维压缩态只能物品到背包且需要逆序 2.对应多重背包而言&#xff0c;组合数物品到背包&#xff0c;排列数背包到物品&#xff0c;且都需要正序

MySQL 服务器权限与对象权限

MySQL服务器权限&#xff08;全局权限&#xff09;和对象权限&#xff08;数据库权限和表权限&#xff09;是MySQL权限体系中的两个重要组成部分&#xff0c;它们共同构成了MySQL的安全管理机制。 服务器权限&#xff08;全局权限&#xff09; 服务器权限&#xff0c;也称为全…

使用nacos分布式配置的好处!!!

1、没使用nacos之前&#xff0c;我们如果修改了配置文件&#xff0c;就必须重新发布应用&#xff0c;配置才会生效。使用nacos远程配置后&#xff0c;配置就可以实时更新&#xff0c;就无需重新发布应用&#xff0c;减少了重新发布所消耗的时间&#xff0c;提高了效率。 2、可…

《QT实用小工具·三十四》Qt/QML使用WebEngine展示的百度ECharts图表Demo

1、概述 源码放在文章末尾 该项目实现了百度ECharts图表的样式&#xff0c;效果demo如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtWebEngine>int main(int argc, ch…

._locked勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 近年来&#xff0c;网络安全问题日益凸显&#xff0c;各种勒索病毒层出不穷&#xff0c;其中._locked勒索病毒以其独特的攻击方式和广泛的传播范围引起了广泛关注。本文91数据恢复将介绍._locked勒索病毒的特点&#xff0c;并探讨有效的应对策略&#xff0c;…

力扣经典150题解析之三十四:有效的数独

目录 解题思路与实现 - 有效的数独问题描述示例解题思路算法实现复杂度分析测试与验证总结 感谢阅读&#xff01; 解题思路与实现 - 有效的数独 问题描述 判断一个 9 x 9 的数独是否有效&#xff0c;根据以下规则验证已经填入的数字是否有效&#xff1a; 数字 1-9 在每一行只…

STM32F4使用FPU/DSP核心启用与测试

STEP1、下载DSP库 具体链接如下&#xff1a; https://www.st.com/en/embedded-software/stsw-stm32065.html?dl9w6sdOSAKySFxBhN764Stg%3D%3D%2CIS1vzyA84KLAefK%2B0DawUl0FScREpiT6AdC3qFjIMJnCIgXIwr82G2XUFo6w43Wp5L5CUyrX3vZAoaHRE3nsTmRsArV3hnQOEgX73SKt8ss1vGrLlfXT24j…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…