[算法题]在排序数组中查找元素的第一个和最后一个位置

news2024/9/21 12:31:31

题目链接: 在排序数组中查找元素的第一个和最后一个位置

二分查找求解, 但是普通版本的二分查找无法求解, 普通版本的二分查找每次根据中点的值与目标值进行区间划分, 但是该题数据为非递减顺序, 所以可能出现如下情况:

nums = [1, 2, 3, 3, 3, 4, 5, 6]

target = 3

此时普通版本就不好使了, 因为你能确定目标值在哪但不能确定左右端点在哪, 所以使用寻找左端点和右端点的二分查找:

1. 寻找左端点的二分查找

区间划分规则:

1) nums[m] < target : l = m + 1;

2) nums[m] >= target : r = m;

其中r = m是关键, 不能是r = m - 1, 因为r所在的位置可能是左端点, 所以不能排除该位置.

循环条件: l < r时继续, l == r时结束循环, 不能等于因为会出现死循环, 而且l == r时就是结果出现之时, 此时只需判断该位置的值是否等于目标值即可.

求中间值公式: m = l + (r - l) / 2, 不需要+1, +1会导致死循环, 当遍历区间只剩两个元素时, 可能出现如下情况:

如果此时是这种情况: nums[m] >= target : r = m, 那就死循环了, 而不+1就没问题.

2. 寻找右端点的二分查找

区间划分规则:

1) nums[m] <= target : l = m;

2) nums[m] > target : r = m - 1;

其中l = m是关键, 不能是l = m + 1, 因为l所在的位置可能是右端点, 所以不能排除该位置.

循环条件: l < r时继续, l == r时结束循环, 不能等于因为会出现死循环, 而且l == r时就是结果出现之时, 此时只需判断该位置的值是否等于目标值即可.

求中间值公式: m = l + (r - l + 1) / 2, 一定要+1, 不+1会导致死循环, 当遍历区间只剩两个元素时, 可能出现如下情况:

如果此时是这种情况: nums[m] <= target : l = m, 那就死循环了, 而+1就没问题.

寻找左端点/右端点版本的二分查找注意事项:

1. 循环条件 while(left < right).

2. 寻找左端点时求中点公式为left + (right - left) / 2, 寻找右端点时求中点公式为left + (right - left + 1) / 2.

本体题解思路: 先使用寻找左端点版本的二分查找找出左端点, 再使用寻找右端点版本的二分查找找出右端点即可.

题解代码:

class Solution 
{
public:
    vector<int> searchRange(vector<int>& nums, int target) 
    {
        if(nums.empty()) return {-1, -1};
        vector<int> res(2, -1);
        //找左端点
        int left = 0;
        int right = nums.size() - 1;
        while(left < right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) left = mid + 1;
            else if(nums[mid] >= target) right = mid;
        }
        if(nums[left] == target) res[0] = left;
        //找右端点
        left = 0;
        right = nums.size() - 1;
        while(left < right)
        {
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target) left = mid;
            else if(nums[mid] > target) right = mid - 1;
        }
        if(nums[left] == target) res[1] = left;
        return res;
    }
};

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

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

相关文章

将VAE用于时间序列:生成时间序列的合成数据

变分自编码器(VAEs)是一种生成式人工智能,因其能够创建逼真的图像而备受关注,它们不仅可以应用在图像上&#xff0c;也可以创建时间序列数据。标准VAE可以被改编以捕捉时间序列数据的周期性和顺序模式,然后用于生成合成数据。本文将使用一维卷积层、策略性的步幅选择、灵活的时…

如何开发一款网店后台多开软件?!

什么是网店后台多开软件&#xff1f; 网店后台多开软件指的是能够同时打开多个网店后台的一款软件&#xff0c;即一个软件上可以登录多个网店后台&#xff08;如&#xff1a;拼多多店铺后台、抖店店铺后台、快手小店店铺后台、孔网店铺后台、微店店铺后台、小红书店铺后台等等…

Leetcode 34. 二分查找 C++实现

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 问题&#xff1a;给你一个按照非递减顺序排列的整数数组 nums &#xff0c;和一个目标值 target 。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target &#xff0c;返回 [-1, -1]。你…

Python之PyInstaller打包EXE程序(带音乐加图片等资源)

Python之PyInstaller打包EXE程序(带音乐加图片等资源) 要将你的 Python 程序打包成一个可执行文件&#xff08;.exe&#xff09;&#xff0c;并确保图片和音乐文件包含在其中&#xff0c;你可以使用 PyInstaller 工具。下面是一个简单的步骤来打包你的程序&#xff1a; 以我的…

Python实现水果忍者(开源)

一、整体介绍&#xff1a; 1.1 前言&#xff1a; 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动&#xff0c;优化并增加了一些功能。作为自己Python阶段学习的结束作品&#xff0c;文章最后有源码链接。 1.2 Python主要知识&#xff1a; &#xff08;1&#xf…

FPGA开发——UART回环实现之发送模块的设计和数据回环整体实现

一、简介 在上一篇文章当中我们实现了UART接收模块的相关设计和功能实现&#xff0c;在今天的文章中我们继续实现剩下的发送模块的相关设计和完成完整的串口数据回环的实验。 在文章的最后我会给出完整的工程&#xff0c;给小伙伴们参考。 二、接收模块的基本设计 在接收模块…

如何下载老版本 的mysql

方案1&#xff1a;打开地址&#xff0c;即可 MySQL :: Download MySQL Community Server (Archived Versions) 输入地址 https://downloads.mysql.com/archives/community/ 方案2&#xff1a; MySQL :: Download MySQL Installer https://dev.mysql.com/downloads/windows…

推荐使用阿贝云免费云服务器、免费虚拟主机

官网地址&#xff1a;https://www.abeiyun.com 阿贝云免费云服务器&#xff0c;性价比之选&#xff01; 不得不说&#xff0c;阿贝云的免费云服务器真的太棒了&#xff01;不仅免费&#xff0c;还能提供如此优质的服务。服务器的配置虽然不算高端&#xff0c;但对于一般的应用…

【MySQL】数据库约束

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 文章目录 系列文章目录前言约束关键字一览NOT NULLUNIQUEDEFAULTPRIMARY KEY自增主键 FOREIGN KEY总结 前言 在学习了数据库的增删改查操作之后&#xff0c;接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据…

宝塔部署Django项目(华为云)

1、登录华为云: 2、点击远程登录: 3、打开宝塔网址(华为云选的是centos) 4、在华为终端复制指令点击运行: 会显示安装完成,出现一个页面记录一下,方便以后登录: 5、复制外网面板地址到浏览器地址栏,输入账号,密码登录,在这里进行配置: 一、Django项目的设置以及压…

Gafgyt僵尸网络针对云原生环境,SSH弱密码成GPU挖矿新目标

近日&#xff0c;网络安全研究人员发现了 Gafgyt 僵尸网络的一个新变种&#xff0c;它以 SSH 密码较弱的机器为目标&#xff0c;最终利用其 GPU 计算能力在被攻击的实例上挖掘加密货币。 Aqua Security 研究员 Assaf Morag 在周三的一份分析报告中说&#xff1a;"这表明&…

虎牙的商业化畅想

2024年8月13日&#xff0c;虎牙公司公布了2024年第二季度财报。财报显示&#xff0c;2024年第二季度&#xff0c;虎牙公司总收入达15.4亿元。其中&#xff0c;来自游戏相关服务、广告和其他业务的收入同比增长152.7%至3.1亿元。在非美国通用会计准则下&#xff0c;该季度归属于…

KDP数据平台:以实战案例验证技术领先力

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP&#xff08;Kubernetes Data Platform&#xff09;在数据处理和…

状态dp或滑动窗口

前言&#xff1a;这个题目可以用状态dp来做&#xff0c;其实还有一个思路&#xff0c;类似滑动窗口&#xff0c;如果有遇到第二个0&#xff0c;左指针加一 class Solution { public:int longestSubarray(vector<int>& nums) {int n nums.size();vector<vector<…

Mac 自定义键盘快捷键打开系统应用

在 macOS 中&#xff0c;可以通过自定义键盘快捷键来打开系统应用程序。这可以更快捷地访问常用的应用程序&#xff0c;提高工作效率。下面以创建活动监视器快捷键为例介绍“Mac 自定义键盘快捷键打开系统应用”的一般步骤&#xff1a; 创建活动监视器快捷键 键入command空格打…

DVWA | Brute Force通关指南

目录 Low Medium High Impossible Brute force主要是通过爆破达到渗透目的&#xff1a; Low 查看源代码&#xff1a; <?phpif( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Get password$pass $_GET[ password ];$pass md5( $pass );//…

软件工程概述(上)

1、软件的概念、特点和分类 要了解软件工程&#xff0c;首先让我们重新认识一下软件。如今可以说是一个软件定义一切的时代&#xff0c;虽然人工智能发展的如火如荼&#xff0c;但究其本质&#xff0c;核心还是软件。那么&#xff0c;如何给软件下一个定义呢&#xff1f;软件又…

再造行业旗舰爆款,书客L2 Pro重塑医护级”护眼更养眼”,被誉为最强旗舰级标杆!

近日&#xff0c;作为照明领域黑马的SUKER书客正式发布护眼台灯L2 Pro&#xff0c;在各项标准都远超国AA的基础上&#xff0c;推出了RRT2.0红光养眼技术、第三代SDIT自适应调光技术以及全新一代紫光激发全光谱技术等一系列首创护眼黑科技&#xff0c;从强悍的护眼效果到惊艳的光…

《python语言程序设计》2018版第7章第04题Fan类,设计一个名为Fan的类表示一个风扇

8点下课到家也9点多。眼睛抬不起来 明天到周二要为好几十个兄弟姐妹们&#xff0c;完成日志和反馈表&#xff0c;还要保证低错误。明天还要完成单位的一些工作。 哦对了&#xff0c;还有这些兄弟姐妹们的视频。 好先看一下Fan类的代码&#xff0c;它继续存在exCode07 class Fa…

【uni-app】使用天气API做一个天气APP(全过程)- 实况、逐小时、40日

头一次使用uni-app写代码, 现学现卖, 写的不好的地方见谅, 申请个appid就可以运行 切换城市界面比较简单, 城市名称需要符合天气api参数规则, 录入的城市不要带市区县; 格式如: 青岛、铁西、海淀、沛县 APP效果 功能说明 实况天气逐小时预报未来7日天气未来40日天气空气质量详…