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

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

解题思路:

        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.dtcms.com/a/253619.html

相关文章:

  • css3 背景色渐变
  • 【java中使用stream处理list数据提取其中的某个字段,并由List<String>转为List<Long>】
  • DNS服务管理企业级实战模拟
  • Flask视频和图片上传
  • win11装vm虚拟机创建Linux常见问题!
  • 线上线下融合驱动:开源链动2+1模式与AI智能名片赋能高价值社群生态的机制研究
  • 常见的Dolphin Scheduler报错
  • Docker Compose部署Spring Cloud 微服务系统
  • 腾讯云搭建web服务器的方法
  • extern关键字:C/C++跨文件编程利器
  • FPGA基础 -- Verilog行为级建模之时序控制
  • 回溯----5.括号生成
  • 如何通过 5 种方式向 Android 手机添加音乐
  • ubuntu下python版本升级导致pyqt不能正常运行解决
  • MSYS2 环境下 Python 开发配置(结合 PyCharm)使用笔记
  • RNN为什么不适合大语言模型
  • html中的table标签以及相关标签
  • ESLint从入门到实战
  • 智净未来:华为智选IAM以科技巧思优化家庭健康饮水体验
  • 2025年中总结
  • Java安全-常规漏洞问题(SQL注入,XXE,SSRF,RCE)
  • Linux系统网络服务之DCHP服务
  • RabbitMQ七种工作模式
  • Kafka入门及实战应用指南
  • 电路图识图基础知识-摇臂钻床识图(三十一)
  • 【学习笔记】2.2 Encoder-Decoder
  • 巧妙解决easyocr在cpu_mode下加载慢的问题~
  • Pandas 核心数据结构详解:Series 和 DataFrame 完全指南
  • MyBatisPlus——逻辑删除
  • import jsonlines ModuleNotFoundError: No module named ‘jsonlines‘