力扣精选算法100题——在排序数组中查找元素的第一个和最后一个位置(二分查找专题)

目录

第一步:了解题意 

第二步:算法原理

🚩查找区间左端点值

❗处理细节

循环条件:

求中点

🚩查找区间右端点值

❗处理细节

循环条件

求中点

🚩总结

第三步:代码实现

第四步:总结模板


第一步:了解题意 

  • 本题是返回的是(在数组中与目标值相等的开始位置和结束位置)如果是{1,2,3,3,3,4,5}我们只需返回{2,4}位置即可,只要返回开始位置和结束位置,中间位置不用返回
  • 如果不存在目标值target,那么我们就返回{-1,-1} 

第二步:算法原理

这一题暴力解法确实是很简单的去实现,但是这一题明确说明了需要时间复杂度为logN来实现,这就意味着不能用暴力解法O(N)。

二分查找法的本质:看区间是否有“二段性”。取一个点能分成俩部分,有一部分是满足条件,则可用二分查找算法。它并不是非得分成一半一半,也可以是三分之一,四分之一,只是复杂度的问题。

其实我们可以利用三分四分二分都可以解决问题,但是我们最合理的是二分方法解决问题,因为用到概率学的期望值中,我们确实如果找到目标值可以在1/4中的小部分,但是我们也可能在1/4的另一个大部分,所以期望值来看,平分是最好的。最终选取中间点进行划分,二分查找时间复杂度最小。


本题是找到开始位置和结束位置,我们可以从查找区间的左端点值和区间的右端点值入手。

🚩查找区间左端点值

我们看到这里,我们会不会想到划分区间(二分查找的本质是'能有“二分段”)我们可以划分【小于t】【大于等于t】俩部分。这时候我们就可以二分查找思路来解题。

  • 由于x<t的话肯定在小于t的区间内,那里面的结果是不可能存在等于target的所以我们给left=mid+1
  • 而x>=t的时候,肯定是在大于等于t的区间内,所以里面的结果是可能存在等于target的,如果mid正好对应的是等于最左边的3的时候,我们是不能给right=mid-1的,所以我就给right=mid即可

❗处理细节

循环条件:

存在俩种情况left<=right和left<right。

最终left是肯定会达到区间的左端点的值的,而right=mid一直在靠近最左端值,最终也会到达端点值,所以我们不需要进行left=right再循环,因为那个时候我们已经指向了结果,我们只需要判断一下left对应的值是否等于target即可。

最终选择left<right.

求中点

求中点:

mid=left+(right-left)/2mid=left+(right-left+1)/2

这俩个中点值,一个值的是在偶数的时候取左值还是右值。

而我们在取区间的左端的时候,我们的left=mid+1  right=mid.

如果我们选择mid=(right+left+1)/2+left的情况下,我们在遇到这个情况下,mid在right的位置,然后right依旧mid,我们就陷入了死循环,我们需要mid指向的是偶区间的左边,而不是右边,因为right=mid,会导致死循环。所以遇到查找区间的左端点值我们选择mid=(right-left)/2+left

🚩查找区间右端点值

  • 由于x>t的话肯定在大于t的区间内,那里面的结果是不可能存在等于target的所以我们给right=mid-1
  • 而x<=t的时候,肯定是在小于等于t的区间内,所以里面的结果是可能存在等于target的,如果mid正好对应的是等于最左边的3的时候,我们是不能给left=mid+1的,所以我就给left=mid即可

❗处理细节

循环条件

和上述的查找区间的左端点值一样。

求中点

而我们在取区间的右端点的时候,我们的left=mid  right=mid-1.

如果我们选择mid=(right+left)/2+left的情况下,我们在遇到这个情况下,mid在left的位置,然后left依旧mid,我们就陷入了死循环,我们需要mid指向的是偶区间的右边,而不是左边,因为left=mid,会导致死循环。所以遇到查找区间的右端点值我们选择mid=(right-left+1)/2+left


🚩总结

  • 循环条件:left<right

区间左端点,区间右端点我们都不需要再进行left=right的循环,所以循环条件是left<right

  • 求中点

区间左端点:mid=(right-left)/2+left    因为left=mid+1  right=mid  偶区间的左边

区间右端点:mid=(right-left+1)/2+left  因为left=mid  right=mid-1  偶区间的右边


第三步:代码实现

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(nums.size()==0){return {-1,-1};}int left=0,right=nums.size()-1;//取左端点值int begin=0;while(left<right){int mid=(right-left)/2+left;if(nums[mid]<target)left=mid+1;else right=mid;}//判断是否有结果if(nums[left]!=target)return {-1,-1};else begin=left;//取右端点值left=0,right=nums.size()-1;while(left<right){int mid=(right-left+1)/2+left;if(nums[mid]<=target)left=mid;else right=mid-1;}return {begin,left};}
};

第四步:总结模板

这只是初步的给个模板,后续会有题目来熟练认知这段代码。


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

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

相关文章

OpenHarmony 鸿蒙使用指南——概述

简介 OpenHarmony采用多内核&#xff08;Linux内核或者LiteOS&#xff09;设计&#xff0c;支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时&#xff0c;如何能够让设备驱动程序在不同内核间平滑迁移&#xff0c;消除驱动代码移植适配和维护的负担&#xff0c;…

技术驱动宠物健康:宠物在线问诊系统的高效搭建手册

在数字化时代&#xff0c;技术正在催生出许多创新的医疗服务&#xff0c;而宠物在线问诊系统便是其中一项引领潮流的创举。本文将为你提供一份高效搭建宠物在线问诊系统的手册&#xff0c;通过技术代码示例&#xff0c;让你轻松打造一套技术驱动的宠物健康管理系统。 1. 架构…

常用芯片学习——HC244芯片

HC573 三态输出八路缓冲器|线路驱动器 使用说明 SNx4HC244 八路缓冲器和线路驱动器专门设计用于提高三态存储器地址驱动器、时钟驱动器以及总线导向接收器和发送器的性能和密度。SNx4HC244 器件配备两个具有独立输出使能 (OE) 输入的 4 位缓冲器和驱动器。当 OE 为低电平时&a…

【java问题解决】-word转pdf踩坑

问题情境&#xff1a; 项目中采用word转pdf&#xff0c;最开始使用的pdf相关的apache的pdfbox和itextpdf&#xff0c;后面发现对于有图片背景的word转pdf的情景&#xff0c;word中的背景图会直接占用位置&#xff0c;导致正文不会正确落在背景图上。 解决方案&#xff1a; 采…

【数据结构】 顺序栈的基本操作 (C语言版)

目录 一、顺序栈 1、顺序栈的定义&#xff1a; 2、顺序栈的优缺点 二、顺序栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、顺序栈的初始化 4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了&#xff0c;但是Fiddler官方还有很多其他扩展插件功能&#xff0c;可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c…

Vue3 Suspense

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

windows cmd命令行隐藏窗口后台启动运行程序,开机自启

隐藏窗口后台启动运行 我的目录结构 start.bat echo off if "%1" "h" goto begin mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit :begin :: cd %~dp0 call shutdown.bat jre…

一文读懂:D3.js的前世今生,以及与echarts的对比

D3.js&#xff08;Data-Driven Documents&#xff09;是一种用于创建动态、交互式数据可视化的JavaScript库。它通过使用HTML、CSS和SVG等Web标准&#xff0c;将数据与文档结合&#xff0c;使得数据可以以一种直观和易于理解的方式进行呈现。D3.js的重要性在于它赋予了开发者更…

【GitHub项目推荐--不错的Rust开源项目】【转载】

01 Rust 即时模式 GUI 库 egui 是一个简单、快速且高度可移植的 Rust 即时模式 GUI 库&#xff0c;可以轻松地将其集成到你选择的游戏引擎中&#xff0c;旨在成为最易于使用的 Rust GUI 库&#xff0c;以及在 Rust 中制作 Web 应用程序的最简单方法。 项目地址&#xff1a;ht…

【面试突击】微信亿级朋友圈的社交系统设计

微信亿级朋友圈的社交系统设计 先来说一下业务需求吧&#xff1a; 每个用户可以发朋友圈&#xff0c;可以点赞&#xff0c;评论可以设置权限&#xff0c;不看某些人朋友圈、不让某些人看你的朋友圈可以刷朋友圈中其他人的动态 对于这样的系统设计&#xff0c;主要从业务来考虑…

uniapp css样式穿透

目录 前言css样式穿透方法不加css样式穿透的代码加css样式穿透的代码不加css样式穿透的代码 与 加css样式穿透的代码 的差别参考 前言 略 css样式穿透方法 使用 /deep/ 进行css样式穿透 不加css样式穿透的代码 <style>div {background-color: #ddd;} </style>…

用这个技术管理备用电源!同事下巴都惊掉了!

在当今社会&#xff0c;电力供应的可靠性对各个行业的正常运行至关重要。而蓄电池作为备用电源的重要组成部分&#xff0c;其性能和状态的稳定管理成为保障电力系统稳定性的关键环节。 因此&#xff0c;为了有效监测和管理蓄电池&#xff0c;蓄电池监控系统应运而生。 客户案例…

智能机器人与旋量代数(12)

Chapt 4. 旋量代数在机器人学中的应用 4.1 串联机器人正运动学的指数积(PoE, Product of Exponetial)公式 4.1.1 回顾&#xff1a;机器人正运动学的Denavit-Hartenberg (D-H)参数公式 D-H 建模法: D-H 建模方法是由 Denavit 和 Hartenberg (ASME, 1955) 提出的一种建模方法&…

如何高效挖掘Web漏洞?

简介 SRC漏洞平台&#xff1a;安全应急响应中心&#xff08;SRC, Security Response Center&#xff09;&#xff0c;是企业用于对外接收来自用户发现并报告的产品安全漏洞的站点。说白了&#xff0c;就是连接白帽子和企业的平台&#xff0c;你去合法提交漏洞给他们&#xff0…

Leetcode—24. 两两交换链表中的节点【中等】

2023每日刷题&#xff08;八十七&#xff09; Leetcode—24. 两两交换链表中的节点 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x),…

Redis(发布订阅、事务、redis整合springboot、集成 Spring Cache)

目录 一.redis的发布订阅 1、什么 是发布和订阅 2、Redis的发布和订阅 3、发布订阅的代码实现 二.Redis事务 1.事务简介 1、在事务执行之前 如果监听的key的值有变化就不能执行 2、在事务执行之前 如果监听的key的值没有变化就能执行 3、Exec之前就出现错误 4、Exec之…

Centos7 两种方式安装 MySQL5.7 步骤 yum 、本地 tar 文件

一、使用 yum 源方式安装 1、卸载系统自带 mariadb MariaDB Server 是最流行的开源 关系型数据库 之一。它由 MySQL 的原始开发者制作&#xff0c;并保证保持开源。 在 CentOS 7 中默认安装有 MariaDB 可忽略&#xff0c;安装完成之后可以直接覆盖掉 MariaDB。 查看并卸载系统…

【极数系列】Flink项目入门搭建(03)

【极数系列】Flink项目入门搭建&#xff08;03&#xff09; 引言 gitee地址&#xff1a;https://gitee.com/shawsongyue/aurora.git 源码直接下载可运行&#xff0c;模块&#xff1a;aurora_flink Flink 版本&#xff1a;1.18.0 Jdk 版本&#xff1a;11 1.创建mavenx项目 2.…

清越 peropure·AI 国内版ChatGP新功能介绍

当OpenAI发布ChatGPT的时候,没有人会意识到,新一代人工智能浪潮将给人类社会带来一场眩晕式变革。其中以ChatGPT为代表的AIGC技术加速成为AI领域的热门发展方向,推动着AI时代的前行发展。面对技术浪潮,清越科技(PeroPure)立足多样化生活场景、精准把握用户实际需求,持续精确Fin…