二分查找-在排序数组中查找元素的第一个和最后一个位置

ops/2024/10/19 15:04:38/

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例

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

查找区间左端点

这里采取二分查找
将数组分为两部分:
在这里插入图片描述

使用左右指针,边比较边移动
在这里插入图片描述

两种可能:

  1. ret<target: left=mid+1
  2. ret>=target: right=mid

注意:循环条件left<right;当两个指针相遇时既是答案,继续判断只会导致死循环

求中点时,同样有两种方式;如果采用第二种方式:遇到ret>=target时,就会死循环
在这里插入图片描述

查找区间右端点
基本同上
将数组分为两部分:
在这里插入图片描述

两种可能:

  1. ret=<target: left=mid
  2. ret>target: right=mid-1

注意:循环条件left<right;当两个指针相遇时既是答案,继续判断只会导致死循环

同上求中点时也是两种方式,这里与上面相反,用第一种方式,遇到 ret=<target时,就会死循环
在这里插入图片描述

完整代码如下:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target){//处理边界情况if(nums.size()==0) return {-1,-1};int begin=0;//二分左端点int left=0,right=nums.size()-1;while(left<right){int mid = left+(right-left)/2;if(nums[mid]>=target) right = mid;else left = mid+1;}if(nums[left]!=target) return {-1,-1};begin = left;//二分右端点left=0,right=nums.size()-1;while(left<right){int mid = left+(right-left+1)/2;if(nums[mid]<=target) left = mid;else right=mid-1;}return {begin,right};}
};

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

相关文章

Linux系统-DHCP原理与配置

目录 一.DHCP工作原理 1.了解DHCP服务 2.使用DHCP的好处 3.DHCP的分配方式 4.DHCP的租约过程 二.DHCP服务器的配置 1.首先先关闭防火墙 2. 安装DHCP有关软件包 3.查看系统的配置文件​编辑 4.设置参数 5.网络配置 一.DHCP工作原理 1.了解DHCP服务 DHCP(Dynamic Hos…

使用 frp 通过云厂商公网IP实现内网穿透

写在前面 有小伙伴推荐&#xff0c;简单了解博文内容涉及 内网穿透 工具 frp 的安装以及2个Demo内网的静态文件服务访问 Demo内网多端口映射 Demo理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的…

智慧工地:引领工地管理和监测的革新

一、智慧工地是什么 智慧工地是智慧地球理念在工程领域的具体应用&#xff0c;是工程全生命周期管理的崭新理念。通过运用信息化手段&#xff0c;智慧工地利用三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;重点关注施工过程管理&#xff0c;建立互联协同、智能生…

[羊城杯 2020]EasySer ---不会编程的崽

稍微带点反序列化&#xff0c;稍微。 常规扫描robots.txt,给出提示star1.php。 很明显的ssrf嘛。直接读 star1.php?pathhttp://127.0.0.1/star1.php <?php error_reporting(0); if ( $_SERVER[REMOTE_ADDR] "127.0.0.1" ) {highlight_file(__FILE__); } $f…

【C++】---STL容器适配器之queue

【C】---STL容器适配器之queue 一、队列1、队列的性质 二、队列类1、队列的构造2、empty()3、push()4、pop()5、size()6、front()7、back() 三、队列的模拟实现1、头文件&#xff08;底层&#xff1a;deque&#xff09;2、测试文件3、底层&#xff1a;list 一、队列 1、队列的…

【云原生|云计算系列】云计算基础概念

欢迎来到云原生专题的云计算系列第一篇博客&#xff0c;我们将探索云计算的基础知识&#xff0c;以帮助您深入了解这个迅速发展的领域。在前一篇博客中&#xff0c;我们介绍了云原生的概念和重要性&#xff0c;强调了它作为云计算的核心理念和实践的关键角色。本篇博客将进一步…

《Beginning C++20 From Novice to Professional》第五章 Arrays and Loops

循环和数组确实是联系比较紧密的两个基础语法&#xff0c;数组让我们管理大量同类对象&#xff0c;循环可以简单地遍历一个范围内的元素 本章我们可以学到&#xff1a; Arrays 数组开辟一段连续空间存储同类元素&#xff0c;我们通过【】下标来访问某个元素 如果无符号整型占…

为什么有的晶圆厂叫特色工艺晶圆厂?

知识星球&#xff08;星球名&#xff1a; 芯片制造与封测社区&#xff09;里的学员问&#xff1a; 经常看看到某某晶圆厂是12英寸特色工艺晶圆厂&#xff0c;特色工艺是指什么&#xff1f; 芯片的种类&#xff1f; 芯片分为四大类:mems,IC,光电器件&#xff0c;分立器件。 …