二分查找实例1(在排序数组中查找元素的第一个和最后一个位置)

news2024/11/6 7:31:24

题目

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

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

算法原理

二分查找的精髓是二段性,不管数组是否有序,只要数组存在二段性(即数组可以分成两部分),那就可以使用二分查找

1 利用二分查找左端点

   假设要查找的左端点的值为t,t将整个数组分为两部分:

   区间一内的所有元素小于t   区间二内的所有元素大于等于t

   假设每一次二分mid下标对应的值为x

   a 若是x<t  则left = mid+1

   b 若是x>=t 则right = mid  (不能是mid+1,因为mid可能就是最终答案,若是right=mid+1,那么即将检索的区间内没有了答案)

2 一些细节:

   a 循环条件:left<right

      不能是left<=right 其一是因为当left==right时已经有答案了,其二是会死循环

      

b 找中点操作:

   1 mid = left+(right-left)/2  选择这个,当区间元素数为偶数时,选择左侧的为中点

   2 mid = left+(right-left+1)/2  不选这个 当区间元素数为偶数时,选择右侧的为中点

   

查找左端点时,当区间内只剩下两个元素时 ,选择1,则mid是前一个元素,那么无论是left=mid+1,还是right=mid ,left和right最终都会相等

而选择2,mid是后一个元素,若是执行right=mid,那么陷入死循环

3 利用二分查找右端点 

   a 若是x<=t 则left = mid(不能是mid+1,因为mid可能是最终结果)

   b 若是x>t 则right = mid-1

c 循环条件:left<right

   求中点:mid = left+(right-left+1)/2  left最终都会等于right 

                 若是选择 mid = left+(right-left)/2,当执行left=mid时,陷入死循环

代码实现:

class Solution 
{
public:
    vector<int> searchRange(vector<int>& nums, int target) 
    {
        if(nums.empty())//处理边界情况
        {
            return {-1,-1};
        }
        //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 
            {
                right = mid;
            }
        }

        int begin = 0;
        if(nums[left]==target)
        {
            begin = left;
        }
        else 
        {
            return {-1,-1};
        }

        //2 二分找右端点
        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,left};
    }
};

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

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

相关文章

深入学习与探索:高级数据结构与复杂算法

文章目录 学习高级数据结构B树&#xff1a;数据库引擎的骨干线段树&#xff1a;高效的区间查询Trie树&#xff1a;高效的字符串检索 探索复杂算法领域图算法&#xff1a;解决复杂网络问题字符串匹配算法&#xff1a;处理文本搜索近似算法&#xff1a;在NP难题上取得近似解 结论…

聊聊Kafka的生产者消费者确认机制

一、生产者确认机制 消息从生产者客户端发送至broker服务端topic&#xff0c;需要ack确认。acks与min.insync.replicas是两个配置参数.其中acks是producer的配置参数&#xff0c;min.insync.replicas是Broker端的配置参数&#xff0c;这两个参数对于生产者不丢失数据起到了很大…

PMP证书续费是否真的有必要呢?(内附续证流程)

PMP项目管理专业人士资格认证是由项目管理协会&#xff08;Project Management Institute&#xff0c;简称PMI&#xff09;发起的。PMP作为世界级的项目管理认证证书&#xff0c;拥有着先进的项目管理知识体系&#xff0c;它严格评估项目管理人员知识技能是否具有高品质的资格认…

Android图片一直在另一张图的下边

因为之前开发的时候&#xff0c;头像设置了高度属性android:elevation"2px",导致同一父布局中另一张图一直就是显示在下方&#xff0c;如下图&#xff1a; 方法一&#xff1a;大家可以注意下也加上这个属性&#xff0c;这个属性值大于上边这个图的值就能在这张图的上…

KubeSphere Namespace 数据删除事故分析与解决全记录

作者&#xff1a;宇轩辞白&#xff0c;运维研发工程师&#xff0c;目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。 前言 2023 年 7 月 23 日在项目上线前夕&#xff0c;K8s 生产环境出现故障&#xff0c;经过紧急修复之后&#xff0c;K8s 环境恢复正常&#…

nodejs-处理http请求

文章目录 前言node 处理 get 请求node 处理 post 请求总结 前言 使用nodejs搭建后端代理服务&#xff0c;处理http请求&#xff0c;理解nodejs是如何处理get、post请求的 node 处理 get 请求 使用 http 模块创建代理服务器使用 querystring 模块解析请求参数req.end 方法发送…

UOS系统下fastdeploy推理

Cmake安装 apt install build-essential zlib1g-dev libssl-dev wget https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2.tar.gz tar -zxvf cmake-3.23.2.tar.gz cd cmake-3.23.2 ./bootstrap make make install cmake --version在Github或者gitee 查…

IDEA中启动类是灰色,重启idea启动类自动消失解决方法

问题描述&#xff1a; idea中启动多个服务会在services中展示服务的信息和控制台&#xff0c;但是经常有一些启动类会变成灰色的&#xff0c;而且重启idea后经常会自动消失&#xff0c;下次启动时需要手动再去启动&#xff0c;很麻烦。如下图所示&#xff1a; 解决方法&…

智能配电管理系统

智能配电管理系统是按用户的需求&#xff0c;遵循配电系统的标准规范而二次开发的一套具有专业性强、自动化程度高、易使用、高性能、高可靠等特点的适用于低压配电系统的电能管理系统。 智能配电管理系统包括监控管理层、网络通信层、现场采集层、用电保护层和受控设备层&…

基于javaweb的网上图书销售系统(servlet+jsp)

系统简介 本项目采用eclipse工具开发&#xff0c;jspservletjquery技术编写&#xff0c;数据库采用的是mysql&#xff0c;navicat开发工具。 角色&#xff1a; 管理员普通用户 模块简介 管理员&#xff1a; 登录用户管理图书分类管理图书管理图书订单管理图书评论管理数据统…

视频云存储/安防监控/AI分析/视频AI智能分析网关:垃圾满溢算法

随着我国科技的发展和城市化进程加快&#xff0c;大家对于生活环境以及空气质量更加重视&#xff0c;要求越来越严格。城市街道垃圾以及生活区垃圾满溢已经成为城市之痛。乱扔垃圾&#xff0c;垃圾不入桶这些行为已经严重影响到了城市的美化问题。特别是炎热的夏日和雨水季节&a…

应用在汽车新风系统中消毒杀菌的UVC灯珠

在病毒、细菌的传播可以说是一个让人敏感而恐惧的事情。而对于车内较小的空间&#xff0c;乘坐人员流动性大&#xff0c;更容易残留细菌病毒。车内缺少通风&#xff0c;残留的污垢垃圾也会滋生细菌&#xff0c;加快细菌的繁殖。所以对于车内消毒就自然不容忽视。 那么问题又来…

软件提示vcruntime140_1.dll丢失的解决方法,以及丢失的原因总结

在运行某些程序时&#xff0c;可能会出现“vcruntime140_1.dll 丢失”的错误提示。这是因为 vcruntime140_1.dll 是 Visual C Redistributable 的一部分&#xff0c;它通常被安装在 Windows 操作系统上。如果该文件丢失或无法找到&#xff0c;可能会导致程序无法正常运行。在我…

华为云使用脚本初始化Linux数据盘

初始化新挂载的磁盘 登录云服务器&#xff0c;执行以下命令获取自动初始化磁盘脚本。 wget https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/datadisk/LinuxVMDataDiskAutoInitialize.sh 说明&#xff1a; 若回显异常&#xff0c;请检查云服务器是否绑定弹性公…

vue-cli搭建一个新项目及基础配置

vue-cli搭建一个新项目及基础配置 一、安装步骤二、main.js配置三、router下的index.js 一、安装步骤 1.安装node环境&#xff1a;下载地址&#xff1a;Node.js 2.安装脚手架&#xff1a;npm install -g vue/cli 3.创建vue项目&#xff1a;vue create 项目名 4.进入项目&…

什么耳机音质最好又不伤耳朵,什么耳机好用耳朵不疼

如果你还在疑问什么耳机好用并且用了耳朵不痛的话&#xff0c;那你就应该看完本片文章了&#xff01; 近年来&#xff0c;骨传导耳机在市场上的热度可谓是飙升不止&#xff0c;走在街头&#xff0c;你会发现无数人戴着这种科技神器。相较于传统的真无线蓝牙耳机&#xff0c;骨传…

奇葩招聘:招程序员,限45岁以上,不加班,薪资还不低……

咱就是说&#xff0c;这年头&#xff0c;谁还不想找一份“越老越吃香”的工作呀&#xff1f; 但是在多金的互联网&#xff0c;却一直充斥着“35岁焦虑”的话题&#xff0c;弄得人心惶惶。焦虑归焦虑&#xff0c;越老越吃香的工作还是有滴~这不&#xff0c;日前&#xff0c;便有…

关于火绒邮件监控引起的扫描任意IP会有25和110端口反馈

之前测试过公司的外网IP&#xff0c;因为之前一直很注意对外映射的端口&#xff0c;都限制了可以访问的IP地址和端口&#xff0c;所以之前扫描的时候是一个端口都扫描不出来的。最近闲的无事&#xff0c;想着再扫描试试&#xff0c;结果发现居然开放了25和110端口&#xff0c;我…

idea中删除断点与删除所有断点

如下如所示&#xff0c;debug执行后&#xff0c;选中第一步 然后在弹出的弹窗中&#xff0c;勾选全部断点&#xff08;默认已勾选&#xff09; &#xff0c;点击减号即可&#xff0c;最后Done关闭弹窗

【运维日常】infiniband网络架构,容器间跨机器不同网段通信

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…