解题思路:

        1.获取信息:

                给定一个非递减顺序的整数数组,要求找出给定元素在该数组中从左往右第一次出现的位置和最后一个出现的位置,即:最右边的位置和最左边的位置

                如果不存在该元素,则返回{ -1 , -1 }

                限制条件:时间复杂度必须是O(log N)

        2.分析题目:(因为这道题我只写出了一种方法,所以我会在这个环节就开始讲解思路了)

                看到这个复杂度,让我想到了二分查找法,那么该怎么用二分查找法来解出这道题呢?

                我们想到,这个数组是一个非递减顺序的整数数组,所以

                如果其中有我们要查找的那个元素,那么即使它存在多个,也会挨在一起

                那我们只需先使用二分查找法找出那个元素,就可以确定我们要找出的那个元素聚集在哪个位置了,这个时候,只需找出这个聚集地的末端和首端即可

                现在来说,当我们第一次查找到了我们要找的那个元素时,此时无非就三种情况

                (1)查找到了首端

                        存下首端位置后,接着向后查找末端位置即可

                (2)查找到了末端

                        存下末端位置后,接着向前查找首端位置即可

                (3)查找到了中间

                        此时要进行两次查找了,分别向前查找首端和向后查找末端即可

                以上就是本题的思路,代码会在最后一个环节

        3.示例查验:

                示例1,示例2和示例3:你可以根据示例来验证一下上述思路是否正确

        4.尝试编写代码:

                (1)二分查找法

                        思路:就如分析题目的环节所说,你可以结合我的代码来进行理解,以下是完整代码

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int begin=0,end=nums.size()-1;//开始第一次查找vector<int>res(2,-1);//准备好存储结果的容器while(begin<=end){int mid=(begin+end)/2;if(nums[mid]==target){//查找到了那个元素int newbegin1=mid,newend1=end;while(newbegin1<newend1){//向后查找末端位置if(newend1-newbegin1==1){newbegin1=(nums[newend1]==target)?newend1:newbegin1;break;}int newmid=(newbegin1+newend1)/2;if(nums[newmid]==target)newbegin1=newmid;else newend1=newmid-1;}res[1]=newbegin1;int newbegin2=begin,newend2=mid;while(newbegin2<newend2){//向前查找前端位置if(newend2-newbegin2==1){newend2=(nums[newbegin2]==target)?newbegin2:newend2;break;}int newmid=(newbegin2+newend2)/2;if(nums[newmid]==target)newend2=newmid;else newbegin2=newmid+1;}res[0]=newend2;return res;}else if(nums[mid]<target)begin=mid+1;//二分查找法的老步骤,就不过多阐述else if(nums[mid]>target)end=mid-1;}return res;//如果没有查找到就直接返回结果{-1,-1}}
};

以上就是这次题解的全部内容,希望能够帮到你,让你有所收获

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

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

相关文章

低秩分解的本质是通过基矩阵和系数矩阵的线性组合,以最小的存储和计算代价近似表示复杂矩阵

低秩分解的本质是通过基矩阵和系数矩阵的线性组合&#xff0c;以最小的存储和计算代价近似表示复杂矩阵 flyfish 一、最基础起点&#xff1a;数字与数组 数字与标量&#xff08;Scalar&#xff09; 单独的数&#xff0c;如 1 , 2.5 , − 3 1, 2.5, -3 1,2.5,−3&#xff0c;…

SVN本地使用--管理个人仓库

1.SVN官网下载链接 Download – TortoiseGit – Windows Shell Interface to Git 一路安装即可&#xff0c;安装后在桌面空白处右键菜单可以看到选项即安装成功。 2.建立个人SVN数据库 选择一个磁盘新建一个文件夹&#xff0c;在文件夹中右键创建数据库。 3.上传文件到SVN…

Cloud Automation-Resource optimization, cleanup and dashboard

如何使用Automation Account Run Book实现自动化 1. 什么是 Runbook&#xff1f; Azure Automation Account 中的 Runbook 是一套自动化脚本&#xff0c;用于在云中或混合环境中执行常规任务。Runbook 支持多种脚本语言&#xff0c;包括 PowerShell、Python、Graphical、Powe…

leetcode_3583 统计特殊三元组

1. 题意 求给定数组中下标 ( i , j , k ) (i,j,k) (i,j,k)的对数&#xff0c; 且满足 i < j < k , 2 a [ j ] a [ i ] a [ k ] i < j <k,2 a[j]a[i]a[k] i<j<k,2a[j]a[i]a[k] 2. 题解 2.1 枚举中间 三个数枚举中间那个数&#xff0c;再存前缀和后缀个数…

Sentinel(一):Sentinel 介绍和安装

一、Sentinel 介绍 1、什么是 Sentinel&#xff1f; 一句话来说&#xff0c;Sentinel就是&#xff1a;分布式系统的流量卫兵&#xff08;官网&#xff09;。 随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量 控制…

pyspark 初试

1、安装jdk sudo apt-get install openjdk-17-jdk 2、安装spark curl -o spark.tgz https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-4.0.0/spark-4.0.0-bin-hadoop3.tgz tar -xvf spark.tgz mv spark-4.0.0-bin-hadoop3 /opt/spark修改 /etc/profile 添加 exp…

深入解析select模型:FD_SET机制与1024限制的终极指南

在Linux网络编程中&#xff0c;select函数是最经典的I/O多路复用技术之一&#xff0c;但其核心机制FD_SET的1024限制常成为高并发系统的瓶颈。本文将深入剖析FD_SET实现原理&#xff0c;并提供突破限制的实战方案。 一、FD_SET底层结构解析 FD_SET本质是固定长度的位图数组&am…

C函数基础.go

前言&#xff1a; 在Go语言中&#xff0c;函数是构成程序的基本模块&#xff0c;它封装了一段具有特定功能的代码&#xff0c;使得代码更易读&#xff0c;更易维护和重用。熟练掌握函数的定义、调用以及相关特性是成为Go语言开发者的必经之路。 目录 函数定义&#xff1a;给代…

什么是池化

池化是深度学习中用于降低数据维度、提取核心特征的一种操作&#xff0c;主要应用于卷积神经网络&#xff08;CNN&#xff09;。其核心思想是通过对局部区域进行聚合统计&#xff08;如取最大值、平均值&#xff09;&#xff0c;保留关键信息的同时减少计算量。 池化的作用 降维…

C++ 性能分析工具:Valgrind 与 perf

在 C 开发中&#xff0c;性能优化是提升软件质量的关键环节。内存泄漏和 CPU 资源消耗是最常见的性能瓶颈&#xff0c;而 Valgrind 和 perf 作为专业的性能分析工具&#xff0c;能帮助开发者精准定位这些问题。下面将从工具原理、使用方法、实战案例等方面进行详细介绍。 一、…

ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展

&#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09; 目录 &#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09;&#x1f3af; 引言&#x1f9f0…

Cursor Rules 的核心定位与作用 DevOps是

Cursor Rules 是 AI 编程工具 Cursor IDE 中的核心功能&#xff0c;用于约束 AI 生成代码的行为&#xff0c;确保其符合项目规范、编码风格或特定技术需求。它本质上是一套持久化、可复用的指令集&#xff0c;会动态插入到 AI 模型的上下文提示中&#xff0c;指导其生成代码的逻…

Qt事件处理机制

事件的概念 在Qt中&#xff0c;以事件驱动UI工具集&#xff0c;包括信号和槽都依赖于Qt的事件处理机制。通常事件是由窗口系统或Qt自身产生的&#xff0c;用以响应所发生的各类事情。如&#xff1a;用户按下并释放键盘或鼠标、窗口缩放后重绘、定时器到时等。如下图&#xff1…

【慧游鲁博】【11】小程序端·游览画卷修改·支持图片url格式·结合图床上传和加载·数据对接

文章目录 需求修改细节前端主要修改点说明&#xff1a;前端传递格式 后端ArtifactItem 类&#xff1a;ScrollServiceImpl 类&#xff1a;修改 InfoPanel 结构重构 ScrollHorizontalRollComposer修改后的 ScrollHorizontalRollComposer移除冗余代码修改总结 数据流图片格式兼容性…

攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎

为什么存储过程审核那么难&#xff1f; 存储过程将数据操作逻辑固化在数据库层&#xff0c;一次编译、多次执行&#xff0c;既能大幅提升性能&#xff0c;也能通过权限隔离增强安全。然而&#xff0c;正因其逻辑复杂、分支众多&#xff0c;存储过程内部的 SQL 审核与优化常常成…

计算机网络零基础完全指南

目录 🌐 什么是计算机网络 生活中的类比 计算机网络的本质 网络的发展历程 🏠 网络IP详解(重点) 1. IP地址是什么? 生活例子:IP地址就像门牌号 IP地址的格式 IP地址的二进制表示 2. IP地址的分类详解 A类地址(大型网络) B类地址(中型网络) C类地址(小…

DL___线性神经网络

1&#xff09;回归&#xff08;regression&#xff09;是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域&#xff0c;回归经常用来表示输入和输出之间的关系。 2&#xff09;一般回归是和预测有关&#xff0c;比如预测价格(房屋&#xff0c;…

WSL2安装与使用(USB、GPU、虚拟机、图形界面)

文章目录 前言WSL2安装&#xff08;手动安装&#xff09;WSL2基础使用VS Code与WSL2配合使用连接USB设备WSL2中使用GPU&#xff08;RTX5060Ti 16G&#xff09;与虚拟机兼容使用&#xff08;Virtual Box&#xff09;图形与桌面环境WSL消失&#xff08;灾难性故障&#xff09;问题…

uni-app项目实战笔记16--实现头部导航栏效果

先来看效果&#xff1a; 要求&#xff1a;顶部导航栏要始终固定在上方&#xff0c;不随页面上下拖动而消失。 代码实现&#xff1a; 1.定义一个自定义导航栏组件&#xff1a;custom-nav-bar.vue&#xff0c;并写入如下代码&#xff1a; <template><view class"…

web3.js 核心包及子模块

. 核心包 (web3) 功能:提供基础连接、工具函数和核心功能。 包含子模块: web3.eth - 以太坊区块链交互 web3.utils - 辅助工具函数 web3.shh - Whisper 协议(已废弃) web3.bzz - Swarm 去中心化存储(已废弃) web3.net - 网络相关功能 web3.contract - 智能合约交互 web3.…