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

news2024/12/24 8:17:36

题目

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例

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

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

思路

二分查找思路解释:

  1. 首先判断数组是否为空,如果为空,则直接返回 {-1, -1},表示找不到目标值在数组中的范围。
  2. 初始化一个长度为 2 的结果数组 result,初始值为 {-1, -1},用于存储最终的结果。
  3. 使用二分查找的思想,在数组 nums 中寻找目标值的起始位置:
    • 初始化搜索范围为 [0, n-1],其中 n 为数组长度。
    • 不断缩小搜索范围,直到左指针 l 和右指针 r 相遇。
    • 在每一步中,计算中间位置 mid,并根据 nums[mid] 与目标值 target 的关系调整左右指针的位置。
    • 最终得到的 l 即为目标值的起始位置,如果 nums[l] 不等于目标值,则说明数组中不存在目标值,直接返回 {-1, -1}。
  4. 如果找到了目标值的起始位置,将其存储在 result[0] 中。
  5. 然后重新初始化左右指针,进行二分查找目标值的结束位置:
    • 同样采用二分查找的思想,在数组中寻找目标值的结束位置。
    • 不断缩小搜索范围,直到左指针 l 和右指针 r 相遇。
    • 在每一步中,计算中间位置 mid,并根据 nums[mid] 与目标值 target 的关系调整左右指针的位置。
    • 最终得到的 l 即为目标值的结束位置。
  6. 将结束位置存储在 result[1] 中,最终返回 result。

这样,代码通过两次二分查找,可以找到目标值在数组中的起始位置和结束位置,并且满足了 O(log n) 的时间复杂度要求。

Code

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty()){
            return {-1, -1};
        }
        vector<int> result(2, -1);
        int n = nums.size();
        int l = 0,r= n-1;
        while(l<r){
            int mid = (l+r)>>1;
            if(nums[mid]>=target)r=mid;
            else l = mid+1;
        }
        if(nums[l]!=target)return {-1,-1};
        else {
            result[0]=l;
            l=0,r=n-1;
            while(l<r){
                int mid = (l+r+1)>>1;
                if(nums[mid]<=target)l=mid;
                else r=mid-1;
            }
            result[1]=l;
            return result;
        }
    }
};

下面是代码的执行效率
在这里插入图片描述
当然我们也可以用更简便的二分查找lower_bound() upper_bound()函数求解:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        auto first = lower_bound(nums.begin(), nums.end(), target);
        auto last = upper_bound(nums.begin(), nums.end(), target);
        
        if (first == nums.end() || *first != target) {
            return {-1, -1};
        } else {
            return {static_cast<int>(first - nums.begin()), static_cast<int>(last - nums.begin() - 1)};
        }
    }
};

这段代码实现了在一个按非递减顺序排列的整数数组中查找目标值的起始位置和结束位置,使用了 C++ 标准库中的 lower_bound() 和 upper_bound() 函数。下面是代码的解释:

  1. 首先,使用 lower_bound(nums.begin(), nums.end(), target) 函数在排序后的数组 nums 中找到第一个不小于目标值 target 的元素的迭代器,赋值给变量 first。

  2. 然后,使用 upper_bound(nums.begin(), nums.end(), target) 函数在排序后的数组 nums 中找到第一个大于目标值 target 的元素的迭代器,赋值给变量 last。

  3. 接着,通过比较 first 是否等于 nums.end() 或 *first 是否等于 target,来判断是否找到了目标值:

    • 如果 first == nums.end(),表示没有找到目标值,直接返回 {-1, -1}。
    • 如果 *first != target,表示没有找到目标值,直接返回 {-1, -1}。
    • 否则,继续执行下面的逻辑。
  4. 最后,根据找到的位置返回结果:

    • 返回 {static_cast(first - nums.begin()), static_cast(last - nums.begin() - 1)},即将第一个出现位置和最后一个出现位置的下一个位置转换为整数,并放入结果数组中返回。

通过使用 lower_bound() 和 upper_bound() 函数,可以非常简洁地实现在排序数组中查找目标值的起始位置和结束位置,避免了手动编写二分查找的复杂逻辑。

但是执行效率不如手写二分查找高
在这里插入图片描述

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

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

相关文章

模型选择与评估

&#x1f6a9; 机器学习的一般流程包括&#xff1a;数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中&#xff0c;我们往往有多种学习算法可供选择&#xff0c;甚至对同一个学习算法&#xff0c;当使用不同的参数配置时&#xff0c;也会产生不同的模型…

Javascript:输入输出

目录 一.前言 二.正文 1.输出 2.输入 3.字面量 概念&#xff1a; 三.结语 一.前言 Javascript作为运行浏览器的语言&#xff0c;对于学习前端的同学来说十分重要&#xff0c;那么从现在开始我们将开始介绍有关 Javascript。 二.正文 1.输出 document.write() : 向body内…

新品齐发!小牛电动打造全场景高端化产品阵列!

2 月 29 日&#xff0c;全球智能城市出行品牌小牛电动发布“新世代性能旗舰”电摩NX、电自NXT&#xff0c;以及“全场景智驾越野电摩”X3三款新品。同时&#xff0c;与知名体育电竞俱乐部——JDG京东电子竞技俱乐部携手&#xff0c;打造“英雄的联盟”超级形象&#xff0c;引领…

扫码点餐多门店先付后餐小程序开发

多门店扫码点餐系统-先付后餐模式-公众号与小程序开源版 适用范围&#xff1a;适用于快销类餐饮&#xff0c;如早餐、面馆、快餐、零食小吃等&#xff0c;满足顾客快捷扫码点餐的需求。 该系统仅支持先付款后就餐的模式&#xff0c;不支持赊账或后付款服务。 核心功能&…

免费pr素材(Premiere创意彩色图形动画背景视频素材)下载

Premiere素材&#xff0c;10个创意彩色图形动画pr背景视频素材&#xff0c;Pr动态图形模板mogrt下载。 特点&#xff1a;Premiere Pro 2023或更高版本&#xff0c;超高清分辨率&#xff1a;38402160&#xff0c;每秒25帧的帧速率&#xff0c;包括教程视频。来自PR素材网&#x…

MDS500-16-ASEMI整流模块MDS500-16参数、封装、尺寸

编辑&#xff1a;ll MDS500-16-ASEMI整流模块MDS500-16参数、封装、尺寸 型号&#xff1a;MDS500-16 品牌&#xff1a;ASEMI 封装&#xff1a;M34 正向电流&#xff08;Id&#xff09;&#xff1a;500A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1600V 正向浪涌…

Amino PEG11 COOH,Amino-PEG11-acid,可在活化剂存在下与氨基反应

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1616426-12-0&#xff0c;Amino-PEG11-acid&#xff0c;Amino PEG11 COOH&#xff0c;H2N-PEG11-CH2CH2COOH&#xff0c;氨基-PEG11-羧酸 一、基本信息 【产品简介】&#xff1a;Amino-PEG11 acid is a heterobifun…

探索Redis 6.0的新特性

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统&#xff0c;通常被用作缓存、消息队列和实时数据处理等场景。它的简单性、高性能以及丰富的数据结构支持使其成为了众多开发者和企业的首选。在Redis 6.0版本中&#xff0c;引入了一…

超越CPU和GPU:引领AI进化的LPU

什么是CPU CPU&#xff08;Central Processing Unit&#xff09;是由数十亿个晶体管构成的&#xff0c;可以拥有多个处理核心&#xff0c;通常被称为计算机的“大脑”。它对所有现代计算系统至关重要&#xff0c;因为它执行计算机和操作系统所需的命令和进程。CPU在决定程序运…

Leetcoder Day32| 贪心算法part05

763.划分字母区间 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例&#xff1a; 输入&#xff1a;S "ababcbacadefegdehijhklij"输出&#xff1a;[9,7…

【Leetcode每日一题】二分查找 - LCR 173. 点名(难度⭐)(24)

1. 题目解析 Leetcode题目链接&#xff1a;LCR 173. 点名 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目所给的连续数组中缺失的数字即可。 2.算法原理 在这个升序的数组中&#xff0c;我们发现&#xff1a; …

金融方案再获认可!持安获评2023年度金融行业优秀解决方案

近日&#xff0c;由网络安全产业资讯媒体安全419主办的《年度策划》2023年度优秀解决方案评选结果正式发布。零信任办公安全技术创新企业持安科技荣获“2023年度优秀解决方案-金融行业优秀解决方案”。 安全419是以内容报道服务于行业的垂直资讯媒体和第三方企业服务机构。11月…

【LeetCode-中等】209.长度最小的子数组-双指针/滑动窗口

力扣题目链接 1. 暴力解法 这道题的暴力解法是两层嵌套for循环&#xff0c;第一层循环从 i 0 开始遍历至数组末尾&#xff0c;第二层循环从 j i 开始遍历至找到总和大于等于 target 的连续子数组&#xff0c;并将该连续子数组的长度与之前找到的子数组长度相比较&#xff0…

腾讯:《智能科技 跨界相变——2024数字科技前沿应用趋势》

1月23日&#xff0c;腾讯发布了题为《智能科技 跨界相变——2024数字科技前沿应用趋势》的报告&#xff0c;报告从计算重塑、智能升维、沉浸交互、未来连接四个方面&#xff0c;对100多项未来技术和重点方向给出了趋势性判断。并表示我们正驶向一个由连接衍生交互、由计算催生智…

mysql服务治理

一、性能监控指标和解决方案 1.QPS 一台 MySQL 数据库&#xff0c;大致处理能力的极限是&#xff0c;每秒一万条左右的简单 SQL&#xff0c;这里的“简单 SQL”&#xff0c;指的是类似于主键查询这种不需要遍历很多条记录的 SQL。 根据服务器的配置高低&#xff0c;可能低端…

能让薪资翻3倍的软件测试面试经验

前言 面试真题&#xff1a;3 轮技术面 HR 面 面试总共经历四轮的面试&#xff0c;三轮的技术面试和一轮的 HR 面试&#xff0c;共耗时 5 个小时以上。 一面&#xff08;组长面&#xff09; 上家公司项目以及团队的规模是怎么样的&#xff1f; 你负责的项目整体的流程是怎么样的…

ETH开源PPO算法学习

前言 项目地址&#xff1a;https://github.com/leggedrobotics/rsl_rl 项目简介&#xff1a;快速简单的强化学习算法实现&#xff0c;设计为完全在 GPU 上运行。这段代码是 NVIDIA Isaac GYM 提供的 rl-pytorch 的进化版。 下载源码&#xff0c;查看目录&#xff0c;整个项目…

vue cesium加载点与定位到指定位置

vue cesium定位到指定位置 window.viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(point.longDeg, point.latDeg, 6500000), orientation: {heading: 6.2079384332084935, roll: 0.00031509431759868534, pitch: -1.535}, duration: 3})vue cesium加载点 …

Talk|卡内基梅隆大学熊浩宇:Open-world Mobile Manipulation-开放世界机器人学习系统

本期为TechBeat人工智能社区第575期线上Talk。 北京时间2月29日(周四)20:00&#xff0c;卡内基梅隆大学研究生—熊浩宇的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “Open-world Mobile Manipulation-开放世界机器人学习系统”&#xff0c;将向…

sora会是AGI的拐点么?

©作者|谢国斌 来源|神州问学 OpenAI近期发布的Sora是一个文本到视频的生成模型。这项技术可以根据用户输入的描述性提示生成视频&#xff0c;延伸现有视频的时间&#xff0c;以及从静态图像生成视频。Sora可以创建长达一分钟的高质量视频&#xff0c;展示出对用户提示的精…