当前位置: 首页 > news >正文

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

在这里插入图片描述

个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》《算法》

文章目录

  • 前言
  • 一、题目解析
  • 二、解题思路
    • 1. 暴力查找
    • 2. 一次二分查找 + 部分遍历
    • 3. 两次二分查找分别查找左右端点
      • 1.查找区间左端点
      • 2. 查找区间右端点
  • 三、代码实现
  • 总结


前言

本篇文章仅是作为小白的我的一些理解,,如果有错误的地方,希望大佬们指出。


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

一、题目解析

在这里插入图片描述
本题数组元素不唯一,可能存在多个target,我们就是要找到target区间中的左端点与右端点。
在这里插入图片描述
如果没有target区间,则返回{-1, -1}

二、解题思路

1. 暴力查找

直接遍历数组,如果可以查找到target则返回第一次与最后一次遇到target的下标,如果不能查找到target则返回{-1, -1}。
时间复杂度:O(n)

2. 一次二分查找 + 部分遍历

优先使用二分查找target,如果可以查找到,就从该下标开始向左向右遍历数组,返回最左边与最右边的target。如果不能查找到,返回{-1, -1}
时间复杂度:O(logn + n)

对于{3,3,3,3,3,3,3,3} target = 3,时间复杂度会退化为O(n)

3. 两次二分查找分别查找左右端点

1.查找区间左端点

我们对示例1使用 “ 二段性 ” 可以发现示例一被target分成了两部分,小于target部分{5, 7, 7}和大于等于target部分{8, 8, 10}。
在这里插入图片描述
如果中点mid到小于target的部分,区间[ left, mid ]这一区间都小于target,不可能是target区间的左端点,那么left = mid + 1;
如果中点mid到大于等于target的部分,区间[ mid, right ]这一区间都大于等于target, 其中mid有可能是target区间的左端点,那么right = mid;
在这里插入图片描述


细节处理

  • 循环条件:left < right
    如果循环条件为left <= right就会死循环。
    在这里插入图片描述

如上图4所示,nums[mid] >= target,right = mid。此时right依然与left指向同一个元素。

  • 求mid的操作
    向下取整:mid = left + (right - left)/2 向上取整:mid = left + (right - left + 1)/2;二者主要区别在与如果区间[ left, right]中的元素个数是偶数时,向下取整取的是中间两个数中左边的数,向上取整取的是中间两个数中右边的数。
    此时查找区间左端点,求mid使用向上取整会导致死循环。
    在这里插入图片描述

2. 查找区间右端点

查找区间右端点思路与查找区间左端点类似。
我们使用“二段性”发现示例一被target分成了两部分,小于等于target部分{5, 7, 7, 8, 8} 和大于target部分{10}。
在这里插入图片描述
如果点mid到小于等于target的部分,区间[ left, mid ] 这一区间都小于等于target,其中mid可能就是target区间的右端点,那么left = mid;
如果点mid到大于target的部分,区间[ mid, right ]这一区间都大于target,不可能是target区间的右端点,那么right= mid - 1;
在这里插入图片描述


细节处理

  • 循环条件:left < right, 理由与查找左端点使的循环条件相同,如果循环条件为left <= right会死循环
    在这里插入图片描述
    如上图4所示,nums[mid] <= target,left = mid, 此时left依然与right指向同一个元素。

  • 求mid的操作,这里就要用向上取整的方法 mid = left + (right - left + 1)/2
    此处查找区间右端点,如果使用向下取整会导致死循环
    在这里插入图片描述

三、代码实现

两次二分查找分别查找左右端点

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

总结

以上就是我对于在排序数组中查找元素的第一个和最后一个位置的理解。感谢支持!!!
在这里插入图片描述

相关文章:

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

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路1. 暴力查找2. 一次二分查找 部分遍历3. 两次二分查找分别查找左右端点1.查找区间左端点2. 查找区间右端点 三、代码实现总结 前言 本篇文…...

javaee ssm框架项目整合thymeleaf2.0 更多thymeleaf标签用法 项目结构图

创建ssmthymeleaf项目 创建ssmthymeleaf项目参考此文 thymeleaf更多常用标签 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>Title</title> …...

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议

目录 1 TCP管理 1.1 三次握手 1.2 四次挥手 1.3 保活计时器 2 wireshark安装及实验 3.1 icmp协议抓包演示 3.2 tcp协议抓包演示 3 UDP协议 3.1 UDP 的主要特点&#xff1a; 4 练习 1 TCP管理 1.1 三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1…...

overleaf在线编辑工具使用教程

文章目录 1 用 orcid注册overleaf获取模板2 使用模板 1 用 orcid注册overleaf获取模板 通常来说&#xff0c;在期刊投稿网站information for author中找template 。下载压缩包后上传到over leaf中。 加入找不到官方模板&#xff0c;用overleaf中的 2 使用模板 .bib文件&…...

Python基础复习【第一弹】【黑马】

本篇是观看b站黑马视频所做的笔记第一弹&#xff0c;为1-98节。 b站-黑马Python # 1.Hello World print("Hello World")# 2.字面量 在代码中&#xff0c;被写下来固定的值# 3.字符串 print("python")# 4.单行注释 # 多行注释""" "&q…...

【Word】公式编辑器中连字符/减号等显示偏长/过长

问题 当公式编辑器中出现连字符的时候&#xff0c;连字符显示偏长&#xff0c;如下图所示&#xff1a; 方法 在连字符的前后加上双引号后即可解决连字符显示偏长的问题。 最终效果对比如下&#xff1a; 结语 Word的公式编辑器中&#xff0c;双引号内部的内容被当做普通…...

架构设计系列4:如何设计高性能架构

在架构设计系列1&#xff1a;什么是架构设计中&#xff0c;我们讲了架构设计的主要目的&#xff0c;是为了解决软件系统复杂度带来的问题&#xff0c;今天我们来聊聊软件系统复杂度的来源之一高性能。 一、什么是高性能架构&#xff1f; 要搞清楚什么是高性能架构&#xff0c…...

1392. 最长快乐前缀

链接&#xff1a; 1392. 最长快乐前缀 题解&#xff1a; class Solution { public:string longestPrefix(string s) {if (s.size() < 0) {return "";}int MOD 1e9 7;// 构建26的n次方&#xff0c;预处理std::vector<long> pow26(s.size());pow26[0] 1…...

【C++设计模式之备忘录模式:行为型】分析及示例

简介 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于保存和恢复对象的状态。备忘录模式通过将对象的状态封装成一个备忘录&#xff08;Memento&#xff09;&#xff0c;并将备忘录保存在一个管理者&#xff08;Caretaker&#xff…...

数据结构与算法(四):哈希表

参考引用 Hello 算法 Github&#xff1a;hello-algo 1. 哈希表 1.1 哈希表概述 哈希表&#xff08;hash table&#xff09;&#xff0c;又称散列表&#xff0c;其通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询 具体而言&#xff0c;向哈希表输入一个键…...

FFmpeg 命令:从入门到精通 | ffplay 播放控制选项

FFmpeg 命令&#xff1a;从入门到精通 | ffplay 播放控制选项 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 播放控制选项选项表格图片 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 播放控制选项 选项表格 项目说明Q&#xff0c;Esc退出播放F&#xff0c;鼠标左键双击全…...

代码随想录day59

647. 回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#…...

【小工具-生成合并文件】使用python实现2个excel文件根据主键合并生成csv文件

1 小工具说明 1.1 功能说明 一般来说&#xff0c;我们会先有一个老的文件&#xff0c;这个文件内容是定制好相关列的表格&#xff0c;作为每天的报告。 当下一天来的时候&#xff0c;需要根据新的报表文件和昨天的报表文件做一个合并&#xff0c;合并的时候就会出现有些事新增…...

【论文阅读】An Evaluation of Concurrency Control with One Thousand Cores

An Evaluation of Concurrency Control with One Thousand Cores Staring into the Abyss: An Evaluation of Concurrency Control with One Thousand Cores ABSTRACT 随着多核处理器的发展&#xff0c;一个芯片可能有几十乃至上百个core。在数百个线程并行运行的情况下&…...

网页版”高德地图“如何设置默认城市?

问题&#xff1a; 每次打开网页版高德地图时默认定位的都是“北京”&#xff0c;想设置起始点为目前本人所在城市&#xff0c;烦恼的是高德地图默认的初始位置是北京。 解决&#xff1a; 目前网页版高德地图暂不支持设置起始点&#xff0c;打开默认都是北京&#xff0c;只能将…...

小谈设计模式(8)—代理模式

小谈设计模式&#xff08;8&#xff09;—代理模式 专栏介绍专栏地址专栏介绍 代理模式代理模式角色分析抽象主题&#xff08;Subject&#xff09;真实主题&#xff08;Real Subject&#xff09;代理&#xff08;Proxy&#xff09; 应用场景远程代理虚拟代理安全代理智能引用代…...

queryWrapper的使用教程

大于、等于、小于 eq 等于 例&#xff1a;queryWrapper.eq("属性","lkm") ——> 属性 lkm ne 不等于 例&#xff1a;queryWrapper.ne("属性","lkm") ——> 属性<> lkm gt 大于 例&#xff1a;queryWrapper.gt("属性…...

数组模拟双链表

文章目录 QuestionIdeasCode Question 实现一个双链表&#xff0c;双链表初始为空&#xff0c;支持 5 种操作&#xff1a; 在最左侧插入一个数&#xff1b; 在最右侧插入一个数&#xff1b; 将第 k 个插入的数删除&#xff1b; 在第 k 个插入的数左侧插入一个数&#xff1b; …...

鸡群优化(CSO)算法(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…...

3. 安装lombok maven镜像设置

安装lombok & maven镜像设置 一、maven镜像设置 Maven:负责进行项目管理、依赖工具管理的 软件。 快捷解决方案&#xff1a; 1.方法一 直接配置系统默认的文件 各个人因为登录的用户名不同&#xff0c;所以目录名不同。 2.方法二 自定义本地仓库的位置 完成之后重新打…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...