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

【Leetcode每日一题】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(难度⭐⭐)(18)

1. 题目解析

Leetcode链接:34. 在排序数组中查找元素的第一个和最后一个位置

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

核心在于找到给定目标值所在的数组下标区间,设计一个O(logn)的算法。


2. 算法原理

寻找左边界思路:

目标:找到数组中第一个大于或等于目标值的元素的索引。

特点

  • 左边区间 [left, resLeft - 1] 的所有元素都小于 target
  • 右边区间(包括 resLeft[resLeft, right] 的所有元素都大于等于 target

二分查找步骤

  1. 初始化 left 和 right 为数组的开始和结束索引。
  2. 计算中间索引 mid(注意向下取整)。
  3. 根据 arr[mid] 与 target 的关系,调整 left 或 right 的值。
    • 如果 arr[mid] < target,则更新 left = mid + 1
    • 如果 arr[mid] >= target,则更新 right = mid
  4. 重复步骤 2 和 3,直到 left > right
  5. 返回 left 或 right(取决于具体实现)。

注意:当 right = mid 时,应向下取整,以防止死循环。

寻找右边界思路:

目标:找到数组中最后一个大于或等于目标值的元素的索引。

特点

  • 左边区间 [left, resRight] 的所有元素都小于等于 target
  • 右边区间 [resRight + 1, right] 的所有元素都大于 target

二分查找步骤

  1. 初始化 left 和 right 为数组的开始和结束索引。
  2. 计算中间索引 mid(注意向上取整)。
  3. 根据 arr[mid] 与 target 的关系,调整 left 或 right 的值。
    • 如果 arr[mid] <= target,则更新 left = mid
    • 如果 arr[mid] > target,则更新 right = mid - 1
  4. 重复步骤 2 和 3,直到 left > right
  5. 返回 right 或 left(取决于具体实现)。

注意:当 right = mid 时,应向上取整,以防止死循环。

通过合理地调整 left 和 right 的值,二分查找可以高效地找到左边界和右边界。


3. 代码编写

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1, begin = -1, end = -1, mid;//找到区间左边界while(left<=right){mid = (left + right)/2;if(nums[mid] > target){right = mid - 1;}else if(nums[mid] < target){left = mid + 1;}else{begin = mid;right--;//right区间左移,使得mid左移,直到到达左区间边界,此时right正好和left重合}}left = 0, right = nums.size() - 1;//找到区间有边界while(left<=right){mid = (left + right)/2;if(nums[mid] > target){right = mid - 1;}else if(nums[mid] < target){left = mid + 1;}else{end = mid;left++;//left区间右移,使得mid右移,直到到达又区间边界,此时left正好和right重合}}return {begin,end};}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

http://www.lryc.cn/news/306720.html

相关文章:

  • 远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”
  • Maven入门:Java项目构建和管理的利器
  • 《游戏引擎架构》 -- 学习4
  • Wagtail安装运行并结合内网穿透实现公网访问本地网站界面
  • 10分钟快速开始SkyWalking结合Springboot项目
  • STM32—触摸键
  • python中字典(dict)原理及其操作
  • ​​​​​​​​​​​​​​.NET Core Web API实现微服务集群部署
  • 网络安全与信创产业发展:构建数字时代的护城河
  • 外包干了3个月,技术倒退1年。。。
  • Unity发布webgl获取浏览器的URL
  • StarRocks实战——多维分析场景与落地实践
  • golang 函数式编程库samber/mo使用: Result
  • Python 实现 CHO 指标计算(济坚指数):股票技术分析的利器系列(12)
  • MySQL的SQL语句
  • ABAP 发送带EXCEL邮件
  • Linux Nginx SSL 证书配置正确,扔展示不安全
  • 算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)
  • Flutter GetX 之 暗黑模式
  • SQLlabs46关
  • 【Android移动开发】Windows10平台安装Android Studio与人工智能算法模型部署案例
  • 【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was
  • Jmeter系列(2)目录介绍
  • vue基础操作(vue基础)
  • EEA架构
  • 【物联网应用案例】牧场牛棚环境管理项目
  • 【Vue】组件通信组件通信
  • 瑞_Redis_Redis客户端
  • 在Ubuntu系统下搭建TDengine集群
  • Easy-Jmeter: 性能测试平台