news 2026/9/4 23:49:52

千问 LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 JavaScript实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
千问 LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 JavaScript实现

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置的 JavaScript 实现,核心思路是两次二分查找:分别寻找目标元素的左边界和右边界。

算法思路

这道题考察的是二分查找的边界收缩:

  1. 寻找左边界:当 nums[mid] >= target 时,不立即返回,而是收缩右边界(right = mid - 1),继续向左半部分寻找。
  2. 寻找右边界:当 nums[mid] <= target 时,收缩左边界(left = mid + 1),继续向右半部分寻找。

注意:由于我们在命中目标时继续收缩边界,最终 left 和 right 会越界(或指向非目标元素)。因此,最后需要判断 left 是否合法,且对应元素是否真的等于 target。

JavaScript 代码实现

/**

  • @param {number[]} nums

  • @param {number} target

  • @return {number[]}
    */
    var searchRange = function(nums, target) {
    // 寻找左边界
    let left = 0;
    let right = nums.length - 1;
    while (left <= right) {
    let mid = Math.floor(left + (right - left) / 2); // 防止整数溢出
    if (nums[mid] < target) {
    left = mid + 1;
    } else {
    // 当 nums[mid] >= target 时,收缩右边界
    right = mid - 1;
    }
    }
    // 循环结束时,left 指向第一个等于 target 的位置
    let leftIdx = left;

    // 寻找右边界
    left = 0;
    right = nums.length - 1;
    while (left <= right) {
    let mid = Math.floor(left + (right - left) / 2);
    if (nums[mid] > target) {
    right = mid - 1;
    } else {
    // 当 nums[mid] <= target 时,收缩左边界
    left = mid + 1;
    }
    }
    // 循环结束时,right 指向最后一个等于 target 的位置
    let rightIdx = right;

    // 边界检查:如果 leftIdx 越界,或者对应元素不等于 target,说明数组中不存在 target
    if (leftIdx < nums.length && nums[leftIdx] === target) {
    return [leftIdx, rightIdx];
    }

    return [-1, -1];
    };

JavaScript 实现的关键细节

  1. 防止整数溢出:
    虽然 JavaScript 中的 Number 是双精度浮点数,但在处理极大数组时,left + right 依然可能超出安全整数范围。使用 Math.floor(left + (right - left) / 2) 是标准的防溢出写法。
  2. 搜索区间 [left, right]:
    这里使用了左闭右闭区间 [left, right]。
    • 初始时 right = nums.length - 1。
    • 循环条件为 left <= right。
    • 这种写法与 Python 版本一致,逻辑直观。
  3. 为什么最后检查 leftIdx 而不是 rightIdx?
    因为 leftIdx 是第一个 >= target 的位置。如果 target 不存在(比如找 9),leftIdx 可能会停在 10 的位置或者越界。只要 leftIdx 合法且 nums[leftIdx] === target,就一定能推导出 rightIdx 也是合法的。
  4. 时间复杂度:
    执行了两次独立的二分查找,时间复杂度为 O(log n),空间复杂度为 O(1)。

掌握这种“遇到目标值不返回,而是继续收缩边界”的二分思想,可以秒杀所有求边界的二分题(如 LeetCode 278 第一个错误的版本、LeetCode 35 搜索插入位置等)。

需要我帮你把这道题的合并写法(单函数实现,通过传入布尔值决定收缩哪一边)也写出来吗?面试时写单函数会显得更精炼。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 21:41:16

开源大模型安全弱点剖析:从评估到部署的实战指南

一次内部测试&#xff0c;让我对开源大模型的安全态度彻底改变。两个月前&#xff0c;我们团队从社区下载了一个并称“能力领先、安全对齐良好”的开放权重模型&#xff0c;准备用它搭建内部知识库问答系统。前两周一切正常&#xff0c;模型回答准确、语气礼貌、响应速度也在可…

作者头像 李华
网站建设 2026/9/4 23:48:27

基于YOLOv8的食品图像分割实战:从数据标注到模型部署全解析

简介&#xff1a;本资源是一个基于YOLOv8实现的食品图像分割与识别系统&#xff0c;面向人工智能初学者、计算机视觉开发者及食品智能分析应用场景的研究者&#xff0c;解决食品图像中多类别目标的精准定位、像素级分割与语义识别问题&#xff0c;适用于饮食辅助、营养评估、智…

作者头像 李华
网站建设 2026/9/4 16:53:34

第324篇 嵌入式Linux系统开发

上篇聊了EtherCAT工业以太网。这篇聊嵌入式Linux——当MCU的性能不够用&#xff0c;需要跑复杂的算法&#xff08;视觉、SLAM、运动规划&#xff09;时&#xff0c;就得用嵌入式Linux。面试中嵌入式Linux的题目覆盖面很广&#xff1a;内核裁剪、设备树、驱动框架、根文件系统&a…

作者头像 李华
网站建设 2026/9/3 15:53:22

【时光清单|13】HarmonyOS ArkTS 应用启动链路实战:从 EntryAbility 到首屏加载保持窗口与路由稳定

【时光清单&#xff5c;13】HarmonyOS ArkTS 应用启动链路实战&#xff1a;从 EntryAbility 到首屏加载保持窗口与路由稳定应用能显示首屏&#xff0c;不等于启动链路已经稳定。首帧闪一下默认主题、状态栏图标与背景同色、底部内容进入手势区、根导航栈被重复创建、loadConten…

作者头像 李华
网站建设 2026/9/3 14:40:11

Android登录功能实战:从高仿QQ项目解析UI、架构与数据持久化

简介&#xff1a;这是一份面向Android初学者与应用开发者的高仿QQ登录界面实战源码&#xff0c;适用于毕业设计参考、个人技能进阶及企业项目UI组件复用。资源完整呈现了登录流程的UI布局、图标资源与基础交互逻辑&#xff0c;覆盖从界面搭建到用户输入响应的核心环节&#xff…

作者头像 李华
网站建设 2026/9/3 18:46:32

Android/Wear OS开发转型:从Google Assistant到Gemini AI的迁移实战指南

这次我们来看一个即将改变 Android 和 Wear OS 生态的重磅消息&#xff1a;Google 已正式宣布&#xff0c;将从 2026 年 9 月开始逐步关闭 Google Assistant&#xff0c;并由其新一代 AI 助手 Gemini 全面接管。这不仅仅是换个名字那么简单&#xff0c;它意味着从系统底层到应用…

作者头像 李华