[优选算法专题三.二分查找——NO.22寻找峰值]

题目链接

162. 寻找峰值

题目描述

题目解答

  • 功能:根据题目定义,峰值元素是指其值严格大于左右相邻值的元素。代码实现了一个时间复杂度为 O (log n) 的算法来查找数组中的峰值元素,若存在多个峰值,返回任意一个峰值的索引即可。
  • 代码逻辑
    • 初始化左右指针:int left = 0, right = nums.size() - 1;,将左指针left指向数组起始位置,右指针right指向数组末尾位置。
    • 二分查找循环:while (left < right),当left小于right时,循环继续,这保证了查找区间内至少有两个元素。
    • 计算中间位置:int mid = left + (right - left) / 2;,通过这种方式计算中间位置mid,可以避免(left + right)可能产生的整数溢出问题。
    • 调整查找区间:如果nums[mid] > nums[mid + 1],说明当前位置形成了一个 “下降趋势”,即mid左侧可能存在峰值,因此将右边界right移动到mid;否则,说明当前位置形成了一个 “上升趋势”,即mid右侧必定存在峰值,将左边界left移动到mid + 1
    • 返回结果:循环结束后,leftright会相遇,此时left指向的位置就是峰值元素的索引,故返回left

例如,对于数组[1, 2, 1, 3, 5, 6, 4],第一次二分mid指向2nums[mid]>nums[mid + 1]不成立,left更新为mid+13;第二次二分mid指向5nums[mid]>nums[mid + 1]成立,right更新为mid5;继续循环,最终leftright会都指向5,返回5,此时索引5对应的元素6就是峰值元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值