Leetcode刷题笔记6

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

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

解法一:暴力查找

[1, 2, 3, 3, 3, 4, 5] t = 3
从前往后扫描暴力查找,最坏情况下O(N)

优化
利用数组有序的特性

解法二:朴素二分

[1, 2, 3, 3, 3, 4, 5] t = 3
 L           M        R
在极端情况下时间复杂度会降低,比如如果数组内的元素都一样

优化
[1, 2, 3, 3, 3, 4, 5] t = 3
[           ] [            ]
左边区间小于t,右边区间大于等于t

当发现问题中有二段线的规律时就可以用二分查找

 L             M             R
[-----------------------------] t
               x


查找区间左端点

1. x < t -> left = mid + 1 -> [left,right]

2. x >= t -> right = mid -> [left, right] 

因为 mid有可能是最终结果,所以不能更新到 mid + 1

细节处理:

1. 循环条件
left < right

a. 当 left = right的时候就是最终结果,无需判断
b. 如果判断,就会死循环

第一种情况:[left, right]中有结果
 L                               R
[-----------------------------] t
[            ][                    ]         
           t
因为 left = mid + 1,所以 left是想跳出左边这个区域的
当left和right相遇的位置就是最终结果

第二种情况:全大于t
 L                              R
[-----------------------------] t
只会命中第二个条件,right只会像左移动
直接判断左端点的值是否是t

第三种情况:全小于t
只会命中第一个条件,left只会像右移动
直接判断右端点的值是否是t

2. 求中点的操作
a. left + (right - left) / 2
b. left + (right - left + 1) / 2
当数组的个数是偶数时,用a求中点是靠左,用b是靠右

用b会陷入死循环,因为是右端点

当a。求的是左端点,当命中第一个条件时left会右移,此时相等的话就终止循环
当命中第二个条件时,right会更新到mid,此时两个又相遇了,又终止循环了
所以求中点的操作只能用a才能终止循环

查找区间右端点

[1, 2, 3, 3, 3, 4, 5] t = 3
[                    ][    ]

左边区间全部小于等于t,右边全部大于t

 L             M             R
[-----------------------------] t
                x
1. x <= t,mid此时在左边区域,所以更新left -> left = mid -> [left, right] left和right中继续寻找结果

2. x > t,mid此时在右边区域,更新right -> right = mid - 1 -> [left, right]

处理细节:
1. 循环条件
left < right

2. 求中点的方式
a. left + (right - left) / 2
b. left + (right - left + 1) / 2

b求的是右端点
当最后元素剩2个时
[* *]
 L R

如果使用a,那么mid现在落在L,那么对于第一个条件,left会在这里不动,然后mid又落在这个位置,就会陷入死循环
使用b,mid就在R,当命中第一个条件时,left会移动到right,终止循环
命中第二个条件,right移动到left,也会终止循环

代码:C++

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {// 处理边界情况if(nums.size() == 0) return {-1, -1};int begin = 0;// 1. 二分左端点int left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2; // 中点下标if(nums[mid] < target) left = mid + 1;else right = mid;}// 结束循环后,left和right相遇// 判断是否有结果if(nums[left] != target) return {-1, -1};else begin = left; // 等于left或right都一样,标记左端点// 2. 二分右端点// 其实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}; // 此时left或者right都存的右端点}
};

当下面出现 -1 的时候,上面就 +1
分类讨论的代码,就题论题即可

查找区间左端点的模版

// 查找区间左端点的模版
while (left < right)
{int mid = left + (right - left) / 2;if (...) left = mid + 1;else right = mid;
}

 查找区间右端点的模版

// 查找区间右端点的模版
while (left < right)
{int mid = left + (right - left + 1) / 2;if (...) left = mid;else right = mid - 1;
}

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

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

相关文章

【LLM多模态】综述Visual Instruction Tuning towards General-Purpose Multimodal Model

note 文章目录 note论文1. 论文试图解决什么问题2. 这是否是一个新的问题3. 这篇文章要验证一个什么科学假设4. 有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f;5. 论文中提到的解决方案之关键是什么&#xff1f;6. 论文中的…

随想录 Day45 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

随想录 Day45 1049. 最后一块石头的重量 II 494. 目标和 474.一和零 1049. 最后一块石头的重量 II 题目链接 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起…

带你学习Mybatis之Mybatis全局配置文件

Mybatis全局配置文件 <?xml version"1.0" encoding"UTF-8"?><configuration> <!-- 配置 --> <properties/> <!-- 属性 --> <settings/> <!-- 设置 --> <typeAliases/> <!-- 类型别名 -->…

车载以太网的未来:OPEN Alliance下17个技术委员会的最新进展与行业影响(下)

从上篇介绍来看&#xff0c;TC1-TC8大多数处于暂停或完成状态。而TC9-TC17在2023年都有不同程度的进展&#xff0c;让我们继续探索藏在其中的车载以太网的发展和挑战。 TC9 Automotive Ethernet Channel & Components&#xff08;in progress&#xff09; TC9的目标是为通…

[初始计算机]——计算机网络的基本概念和发展史及OSI参考模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月30日11点59分 &#x1f004;️文章质量&#xff1a;96分 ​ 目录 &#x1f310;计算机网络概述 &#x1f4af;…

opencv是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

1.opencv是什么&#xff1f; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;旨在提供一系列丰富的图像处理和计算机视觉算法&#xff0c;以及用于构建实时图像处理和机器视觉应用程序的开发工具。它最初由英特尔开发…

使用QT可视化操作信号与槽函数详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、QT信号与槽机制概述 三、实际操作步骤 四、案例演示 五、总结 一、引言 在…

中国养生保健元宇宙-探索养生保健新领域

在全球化和科技迅速发展的今天&#xff0c;元宇宙作为一种全新的互联网应用和社会形态&#xff0c;正逐步渗透到人们生活的各个方面。特别是在养生保健领域&#xff0c;中国的元宇宙概念正在引领一场革命&#xff0c;将古老的养生智慧与现代科技完美融合&#xff0c;为人们打造…

单片机建立自己的库文件(1)

文章目录 前言一、代码模块化是什么&#xff1f;二、使用步骤1.以LCD1602作为例子2.将LCD1602 相关的代码抽取到另外一个文件中 三、调用LCD1602.h1.新建一个工程项目&#xff0c;将LCD1602.h添加到工程中2.在主函数上加入 #include <LCD1602.h> 总结 前言 提示&#xf…

进口铝合金电动隔膜泵

进口铝合金电动隔膜泵是一种高效、可靠的工业泵&#xff0c;其特点、性能与应用广泛&#xff0c;以下是对其的详细分析&#xff1a; 特点 材质与结构&#xff1a; 采用铝合金材料制造&#xff0c;具有良好的耐腐蚀性和轻量化特点。铝合金材质使得泵体结构紧凑、轻便&#xff…

svg实现一个圆形以及方形的环形进度条

1. svg实现圆形进度条 效果图&#xff1a; 1. 写个假接口&#xff1a; let res {curLegendList: [{ progress: "87", name: "进度1",color:"#00fe41" },{ progress: "66", name: "进度2" ,color:"orange"},{ p…

gitlab服务器迁移(亲测有效)

描述&#xff1a;最近公司迁移gitlab&#xff0c;我没有迁移过&#xff0c;经过网上查找资料最终完成迁移&#xff0c;途中也遇到挺多坑和两个问题&#xff0c;希望能帮到你。 新服务器安装gitlab 注意&#xff1a;新服务器gitlab版本也需要和旧版本一致。 首先查看原Gitlab…

基于Python实现地震数据可视化的设计与实现

基于Python实现地震数据可视化的设计与实现 “Design and Implementation of Earthquake Data Visualization using Python” 完整下载链接:基于Python实现地震数据可视化的设计与实现 文章目录 基于Python实现地震数据可视化的设计与实现摘要第一章 引言1.1 研究背景1.2 研究…

RabbitMQ(三)SpringBoot整合,可靠性投递,死信队列,延迟队列,消费端限流,消息超时

文章目录 整合Springboot概述消费者生产者 消息可靠性投递故障原因解决方案生产者端消息确认机制&#xff08;故障情况1&#xff09;故障情况2解决方案故障情况3解决方案 消费端限流概念 消息超时概念队列层面&#xff1a;配置队列过期消息本身&#xff1a;配置消息过期 死信队…

C++中的虚函数和纯虚函数

目录 摘要 虚函数&#xff08;Virtual Functions&#xff09; 定义 用法 纯虚函数&#xff08;Pure Virtual Functions&#xff09; 定义 用法 需要避开的坑 总结 摘要 在C中&#xff0c;我们经常会在开发中使用到虚函数&#xff08;Virtual Functions&#xff09;和…

如何有效屏蔽手机上的骚扰电话20240530

如何有效屏蔽手机上的骚扰电话 引言 最近&#xff0c;我的手机经常接到954开头的7位数字座机电话&#xff0c;这些骚扰电话让我非常困扰。由于我经常点外卖&#xff0c;无法屏蔽所有陌生号码&#xff0c;因此需要一个既能屏蔽特定前缀的骚扰电话&#xff0c;又不影响日常生活…

英伟达(NVIDIA)H100性能及应用场景

英伟达H100是一款性能强大的GPU芯片&#xff0c;其关键性能参数和应用领域可以归纳如下&#xff1a; 一、性能参数 架构&#xff1a;H100采用了新一代的Hopper架构&#xff0c;拥有高达1.8万亿次/秒的张量处理能力和高达840 TFLOPS的FP8张量性能。CUDA核心数&#xff1a;H100…

STM32学习和实践笔记(33):待机唤醒实验

1.STM32待机模式介绍 很多单片机具有低功耗模式&#xff0c;比如MSP430、STM8L等&#xff0c;我们的STM32也不例外。默认情况下&#xff0c;系统复位或上电复位后&#xff0c;微控制器进入运行模式。在运行模式下&#xff0c;HCLK 为CPU提供时钟&#xff0c;并执行程序代码。这…

kafka学习笔记06

Kafka数据存储流程和log日志讲解 讲解分布式应用核心CAP知识 Kafka数据可靠性保证原理之副本机制Replica介绍《上》 Kafka数据可靠性保证原理之副本机制Replica介绍《下》 Kafka数据可靠性保证原理之ISR机制讲解 Kafka的HighWatermark的作用你知道多少

暑期来临,AI智能视频分析方案筑牢防溺水安全屏障

随着夏季暑期的来临&#xff0c;未成年人溺水事故频发。传统的防溺水方式往往依赖于人工巡逻和警示标识的设置&#xff0c;但这种方式存在人力不足、反应速度慢等局限性。近年来&#xff0c;随着视频监控智能分析技术的不断发展&#xff0c;其在夏季防溺水中的应用也日益凸显出…