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

LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(C语言 | 二分查找)

一、题目描述

给你一个按照非递减顺序排列的整数数组nums,和一个目标值target

请你找出给定目标值在数组中的开始位置结束位置

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

要求算法时间复杂度必须为:

O(log n)

示例:

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

二、解题思路

由于数组是有序数组,并且要求时间复杂度O(log n),因此可以想到使用二分查找

但本题需要找到:

target 的最左位置 target 的最右位置

因此我们需要进行两次二分查找

查找内容目标
第一次二分找到 target 的左边界
第二次二分找到 target 的右边界

三、寻找左边界

目标:

找到第一个 >= target 的位置

二分逻辑:

nums[mid] >= target r = mid - 1 else l = mid + 1

循环结束后:

l 就是第一个 >= target 的位置

再判断:

nums[l] == target

否则说明不存在。


四、寻找右边界

目标:

找到最后一个 <= target 的位置

二分逻辑:

nums[mid] <= target l = mid + 1 else r = mid - 1

循环结束后:

r 就是最后一个 <= target 的位置

五、算法流程

完整步骤:

1. 二分查找 target 的左边界 2. 如果不存在 target,返回 [-1,-1] 3. 二分查找 target 的右边界 4. 返回结果

时间复杂度:

O(log n)

空间复杂度:

O(1)

六、C语言实现

/** * Note: The returned array must be malloced, assume caller calls free(). */ int* searchRange(int* nums, int numsSize, int target, int* returnSize) { int* res = (int*)malloc(sizeof(int) * 2); *returnSize = 2; res[0] = -1; res[1] = -1; if (numsSize == 0) return res; int l = 0; int r = numsSize - 1; // 查找左边界 while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] >= target) r = mid - 1; else l = mid + 1; } if (l >= numsSize || nums[l] != target) return res; res[0] = l; // 查找右边界 r = numsSize - 1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] <= target) l = mid + 1; else r = mid - 1; } res[1] = r; return res; }

七、示例分析

输入:

nums = [5,7,7,8,8,10] target = 8

查找左边界:

最终 l = 3

查找右边界:

最终 r = 4

返回:

[3,4]

八、总结

本题的关键在于二分查找边界问题

查找类型判断条件
左边界nums[mid] >= target
右边界nums[mid] <= target

记忆口诀:

找左边界:>= 找右边界:<=

通过两次二分查找即可在O(log n)时间内解决问题。

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

相关文章:

  • 机器人控制算法实战:从PID到神经网络,如何选择最适合你的方案?
  • RK3576嵌入式平台Docker部署与NPU容器化实践
  • 2026六大城市高端腕表“指针损伤”终极档案:从劳力士夜光脱落到爱彼针片变形,那三根针正在悄悄告诉你什么? - 时光修表匠
  • 波利亚数学方法论 | 猜测、证明与建构在〈数学分析中问题与定理〉中的实践简述
  • 小众+热门全覆盖|六大城市高端腕表养护维修全攻略(全新版) - 时光修表匠
  • Linux基础学习二
  • 2026年有实力的车身改色品牌企业推荐,鹰潭地区优选 - 工业品牌热点
  • 微信小程序 洗衣店 干洗店预约系统
  • 别再傻傻分不清了!SSH端口转发三兄弟(-L/-R/-D)保姆级实战指南
  • MySQL中DROP、TRUNCATE和DELETE
  • 组态技术解析:从概念到典型应用场景
  • 探讨高性价比的车身改色企业,鹰潭怎么选择? - myqiye
  • 继电器模块原理与嵌入式驱动设计实战
  • RK3576嵌入式AI开发环境:离线代码生成与NPU推理实战
  • 238.除了自身以外数组的乘积
  • 聊聊立新菌种培训是否与时俱进,培训费用在行业中算高吗? - 工业推荐榜
  • vue3中const的使用和定义
  • Fiddler抓包工具的使用
  • MT5 Zero-Shot效果展示:短视频脚本多版本生成——情绪/长度/风格可控
  • QWEN-AUDIO新手入门:详解Vivian/Emma/Ryan/Jack四种音色怎么选
  • 分析2026年河南好用的食用菌培训企业,费用怎么算 - 工业设备
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4实战:构建网络安全知识问答与漏洞分析助手
  • NAS硬盘兼容性扩展:突破群晖存储设备限制的技术方案
  • C++:引用
  • 盘点好用的食用菌品鉴培训机构,立新菌种培训学校上榜了吗 - 工业品网
  • 新设备用不好?“视频教程+实操考核”,新手7天上手
  • LangChain:如何通过 Harness Engineering 提升 Agent 表现
  • Qwen3-VL-8B MySQL安装配置智能助手:根据报错截图提供解决方案
  • 5.2 防火墙的结构和原理
  • Protocol Launcher 系列:macOS 原生应用的深度集成(三)