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

LeetCode 852:山脉数组的峰顶索引解析与实现

LeetCode 852:山脉数组的峰顶索引解析与实现

题目描述

给定一个长度为 n 的整数山脉数组 arr,其中的值先递增到一个峰值元素,然后递减

要求返回峰值元素的下标。

题目要求必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

示例

示例 1:

输入:arr = [0,1,0]
输出:1

示例 2:

输入:arr = [0,2,1,0]
输出:1

示例 3:

输入:arr = [0,10,5,2]
输出:1

提示

  • 3 <= arr.length <= 10^5
  • 0 <= arr[i] <= 10^6
  • 题目数据保证 arr 是一个山脉数组

问题分析

这道题目是经典的二分查找应用场景。所谓山脉数组,就是先递增后递减的数组,类似于一座山的形状。我们需要找到山顶的位置,也就是数组中的最大值的索引。

根据题目要求,时间复杂度必须是 O(log(n)),这明确提示我们应该使用二分查找算法。

解题思路

  1. 在山脉数组中,对于峰值左侧的元素,有 arr[i] < arr[i+1]
  2. 对于峰值右侧的元素,有 arr[i] > arr[i+1]
  3. 峰值元素同时满足 arr[i-1] < arr[i]arr[i] > arr[i+1](如果索引有效)

利用这些性质,我们可以通过二分查找快速定位峰值的位置:

  • 如果 arr[mid] < arr[mid+1],说明 mid 在峰值左侧,峰值在右半部分
  • 如果 arr[mid] > arr[mid+1],说明 mid 可能是峰值或者在峰值右侧,峰值在左半部分(包括 mid)

代码实现

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {// 初始化左右边界int left = 0;int right = arr.size() - 1;// 二分查找过程while (left < right) {// 计算中间位置int mid = left + (right - left) / 2;// 如果中间元素小于其右侧元素,说明峰值在右侧if (arr[mid] < arr[mid + 1]) {
http://www.xdnf.cn/news/15856.html

相关文章:

  • STM32CubeMX的一些操作步骤的作用
  • 7-20 关于mysql
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • 【硬件】GalaxyTabPro10.1(SM-T520)刷机/TWRP/LineageOS14/安卓7升级小白向保姆教程
  • RxSwift-事件属性
  • JVM-Java
  • LINUX(三)文件I/O、对文件打开、读、写、偏移量
  • 股票及金融笔记
  • 使用Qt6 QML/C++ 和CMake构建海康威视摄像头应用(代码开源)
  • 双8无碳小车“cad【17张】三维图+设计说名书
  • 【橘子分布式】gRPC(编程篇-下)
  • 嵌入式硬件篇---机械臂运动学解算(3自由度)
  • 机器学习-数据预处理
  • 【机器学习【9】】评估算法:数据集划分与算法泛化能力评估
  • 物联网安装调试-继电器
  • Java设计模式之行为型模式(备忘录模式)实现方式与测试用例
  • 【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)
  • 第四次作业
  • haproxy七层代理
  • 嵌入式硬件篇---继电器
  • C#.NET EFCore.BulkExtensions 扩展详解
  • 物联网安装调试-温湿度传感器
  • 分布式文件系统04-DataNode海量数据分布式高可靠存储
  • python中读取 Excel 表格数据
  • 【数据结构】揭秘二叉树与堆--用C语言实现堆
  • 【MySQL】索引中的页以及索引的分类
  • LLVM中AST节点类型
  • string【下】- 补充
  • MySQL中的排序和分页
  • 集群与高可用