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

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

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

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

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

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

一、核心思想总结       来源:灵茶山艾府

有序数组中目标值的区间 [start, end] 满足两个特征:
  1. start 是数组中第一个 ≥ target 的元素下标(目标值的起始位置);
  2. end 是数组中第一个 ≥ target+1 的元素下标 - 1(目标值的结束位置);
  3. start 超出数组范围,或 nums[start] ≠ target,说明目标值不存在,返回 [-1,-1]
简单理解:把目标值的区间看作「夹在 target 和 target+1 之间」,用两次二分找到这两个边界,就能快速确定目标值的起止位置。

lowbound 方法的核心逻辑:

  • 循环中不断缩小范围,最终 left 会停在「第一个大于等于 target 的元素下标」;
  • 特殊情况:
    • 若 target 比所有元素大 → left = nums.length(超出数组范围);
    • 若 target 比所有元素小 → left = 0
    • 若数组为空 → left = 0(循环不执行,直接返回)。

【背】

right = mid-1 不可以换成break。通过right左移,nums[mid]在变化 带动left变化移动至第一个target
        while(left<=right){int mid = (right-left)/2+left;if(nums[mid] < target) left = mid+1;else right = mid-1;}

【完整代码】

class Solution {/*** 在有序整数数组中查找目标值的第一个和最后一个位置* @return 目标值的起始和结束下标,不存在则返回 [-1,-1]*/public int[] searchRange(int[] nums, int target) {// 1. 找第一个 >= target 的元素下标(目标值的起始位置)int start = lowbound(nums, target);// 2. 找第一个 >= target+1 的元素下标,减1即为目标值的结束位置int end = lowbound(nums, target + 1) - 1;// 3. 判断目标值是否不存在://    - 情况1:start == nums.length → target比所有元素都大(下标越界)//    - 情况2:nums[start] != target → 数组中无target(start指向的元素不是target)//    注意:必须先判断start是否越界,再访问nums[start],避免数组下标越界异常if (start == nums.length || nums[start] != target) {return new int[]{-1, -1};}// 4. 目标值存在,返回起止下标return new int[]{start, end};}//二分查找:找数组中第一个 >= target 的元素下标(下界查找)// return 第一个 >= target 的元素下标;若所有元素都 < target,返回nums.lengthpublic int lowbound(int[] nums, int target) {// 左边界:初始化为数组第一个元素的下标int left = 0;// 右边界:初始化为数组最后一个元素的下标int right = nums.length - 1;// 二分查找核心循环:缩小查找范围,直到left > rightwhile (left <= right) {// 计算中间下标:避免 (left + right) 整数溢出,等价于 (left + right) / 2int mid = (right - left) / 2 + left;if (nums[mid] < target) {// 中间值 < 目标值 → 下界在右半区,左边界右移left = mid + 1;} else {// 中间值 >= 目标值 → 下界在左半区(包括mid),右边界左移right = mid - 1;}}// 循环结束时,left 即为第一个 >= target 的元素下标return left;}
}

【灵神NB】

end = lowbound(nums, target + 1) - 1 这也太巧妙了

 

http://www.jsqmd.com/news/345456/

相关文章:

  • 好写作AI:你的“思想副驾驶”,导航归你,跑腿归我!
  • 好写作AI:你的“大脑内存清理大师”,把CPU从文献苦力中解放给真正的思考!
  • 2026年GEO优化团队推荐,哪家能带来高性价比服务? - 工业品牌热点
  • HubSpot 入门指南(4):什么是 Content Hub?热门功能讲解与定价说明
  • 好写作AI:打造你的“赛博导师”,一个真正懂你研究领域的AI伙伴!
  • 西门子 S7 - 1200 PLC 控制 5 轴伺服项目全解析
  • 2026年厨师培训学校权威推荐:短期速成/烹饪/酒店/技能厨师班源头精选 - 品牌推荐官
  • 鲁棒性(Robustness)的概念
  • 基于Java+Springboot+Vue开发的健身房管理系统源码+运行步骤+计算机科学与技术
  • 2026年无锡、苏州等地热门的喂料机厂家推荐,哪家口碑好值得选? - 工业设备
  • 2026性价比超高的儿童鞋服品牌推荐 - 品牌测评鉴赏家
  • 硅电池产线设备集中监控管理平台方案
  • 2026年0-16岁儿童鞋服精选品牌合集|宝妈闭眼入,性价比与颜值双在线! - 品牌测评鉴赏家
  • TechWiz LCD 2D应用:不同结构下的VT曲线
  • 智慧城市门头广告牌街头街道旁广告牌检测数据集VOC+YOLO格式1238张1类别
  • 2026年主数据管理哪家好?5家优质数字科技企业综合盘点 - 品牌2025
  • Linux 服务器时间不对?宝塔数据库备份还是 UTC?一篇彻底讲清楚(小白必看)
  • 回到DOE设计的未来(1)
  • 聊聊昆明诚信的别墅全案设计品牌企业,哪家口碑更好? - 工业推荐榜
  • 构造二维周期性光栅结构
  • libtorch cmake 配置提示 Failed to compute shorthash for libnvrtc.so
  • 十年以上的程序员,如果没有走向管理岗位或者成为技术大牛..
  • 2026年昆明资质齐全靠谱的别墅全案设计专业公司排名与选购指南 - myqiye
  • 2026儿童囤货指南!超实用儿童鞋服+家居服品牌推荐,颜值品质双在线 - 品牌测评鉴赏家
  • OptiSystem应用:半导体激光器调制
  • AI元人文构想:AI在构想构建期间的语言贡献与行动局限
  • 怎么选择电子超纯水设备服务商,上海统洁靠谱吗? - 工业品网
  • 信管毕业设计本科生题目怎么做
  • 2026年靠谱的大型集团不动产资产管理系统软件有哪些 - 品牌2025
  • 2026年V型对夹球阀定制厂家选择,哪家性价比高的排名揭晓 - 工业品牌热点