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

【 每天学习一点算法 2026/03/25】在排序数组中查找元素的第一个和最后一个位置

每天学习一点算法 2026/03/25

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

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

  1. 直接利用 JS 的 api 取就行了

    functionsearchRange(nums:number[],target:number):number[]{return[nums.findIndex(item=>item===target),nums.findLastIndex(item=>item===target)]};
  2. 通用的方法肯定就是遍历查找,因为是已经排序好的数组,我们利用二分查找是最快的。

    正常二分法查找一个元素就是,两个指针分别指向数组两端,然后取中间值跟目标值作比较,如果中间值大于目标值表示目标值在左侧区间,否则在右侧区间。

    但是这个我们要思考如何找到最左侧和最右侧的目标值。

    首先边界是两个指针相遇:left <= right

    假设我们取Math.floor((left + right) / 2)

    • 如果nums[mid] > target,表示目标值在这个中间值的左侧,需要使right = mid - 1继续搜索
    • 如果nums[mid] < target,表示目标值在这个中间值的右侧,需要使left = mid + 1继续搜索
    • 如果nums[mid] == target,表示这就是目标值了。

    如果我们要继续搜索左侧还有没有目标值是不是得继续移动右指针使right = mid - 1继续搜索,最终就会找到最左侧的目标值(最终遍历结束的时候上一个中间节点值一定就是最左侧目标值)。

    如果我们要继续搜索右侧还有没有目标值是不是得继续移动左指针使left = mid + 1继续搜索,最终就会找到最右侧的目标值(最终遍历结束的时候上一个中间节点值一定就是最右侧目标值的下一个元素)。

    最后就是还要考虑找不到目标值的情况。

    functionsearchRange(nums:number[],target:number):number[]{functionfindIndex(nums:number[],target:number,isLower:boolean){letleft=0,right=nums.length-1letindex=nums.length// 我们只在右节点移动时做了下标赋值操作,所以起始下标要放在 nums.length 处while(left<=right){constmid=Math.floor((left+right)/2)// 根据传入的表示确定是找最左侧还是最右侧的目标值if(nums[mid]>target||(isLower&&nums[mid]>=target)){right=mid-1// 保存当前中间值下标index=mid}else{left=mid+1}}// 遍历结束 当前 index 为遍历结束的时候上一个中间节点值returnindex}constres=[-1,1]constleftIndex=findIndex(nums,target,true)constrightIndex=findIndex(nums,target,false)-1if(nums[leftIndex]===target&&nums[rightIndex]===target){// 确认找到目标值res=[leftIndex,rightIndex]}returnres};

    题目来源:力扣(LeetCode)

http://www.cnnetsun.cn/news/1475353.html

相关文章:

  • 从零开始使用Materialize打造专业PBR材质:完整指南
  • 半导体假芯片泛滥现状与鉴别防控策略
  • Zabbix虚拟机安装避坑指南:从镜像下载到控制台访问的全流程解析
  • Clawdbot汉化版实际效果:Telegram Bot用--thinking high完成技术选型报告(含对比表格)
  • USB接口全解析:从Type-A到Type-C,教你如何一眼识别并正确使用
  • 从零实现Seq2Seq翻译模型:GRU与Attention机制深度解析
  • 拼多多商家必看:如何用百度指数+AI生成技术自动优化商品标题(附实战案例)
  • 保姆级教程:用STC89C52单片机解码红外遥控器(附NEC协议解析代码)
  • vLLM实战:如何将本地已下载的Yi-1.5-6B模型跑起来(离线部署指南)
  • Gemini 3.0 Pro实战:我用它两分钟‘搓’了个网页版MacOS,附完整提示词和代码
  • 实战教程:用Dify和TF-IDF提升RAG检索效果(附Python代码)
  • LFM2.5-1.2B-Thinking-GGUF部署教程:适配Jetson Orin等边缘GPU完整流程
  • 手把手教程:用Chainlit快速搭建Qwen2.5-VL智能看图助手
  • Prometheus UI 核心页面功能详解与实战场景指南
  • 解密书匠策AI:论文开题报告的“智慧导航仪”
  • Preact日期时间选择器实战:零配置无缝集成pickadate.js全指南
  • SQL SERVER2022用户创建与权限配置实战指南
  • 当传统OCR撞上多模态AI:如何用dots.ocr解决复杂文档解析难题
  • Apache Superset API实战手册:从问题解决到企业集成
  • OpenClaw 2026.3.23:安全、插件、生态三重升级,AI助手进入新纪元
  • 粒子群算法调参避坑指南:惯性权重和学习因子到底怎么设?看这篇就够了
  • 年仅41岁,痛别张雪峰老师:“人生真好玩,下辈子还来”
  • 如何快速实现浏览器自动化:n8n-nodes-puppeteer完整指南
  • JIT加速失效?Python 3.15默认禁用真相,5行代码强制激活+3类函数编译阈值调优,立即提速
  • 从Rhino到UE5:利用Datasmith实现工业设计模型的高保真实时可视化
  • COMSOL注浆模拟:探索微裂隙土体中的浆液注入奥秘
  • Mermaid图表革命:告别拖拽式设计,拥抱文本驱动的可视化新时代
  • 放大就糊?噪点满屏?这个AI神器一键全搞定!智能AI图片增强工具Aiarty Image Enhancer v3.10 多语便携版
  • 双鱼眼VR全景制作避坑指南:如何用Torch优化拼接缝处理?
  • 小米智能家居与Home Assistant无缝集成指南:零代码实现全屋设备统一管控