[toc]

# 【题目】

峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums [-1] = nums [n] = -∞ 。 你必须实现时间复杂度为 O (log n) 的算法来解决此问题。

# 【题解】

这道题本质上数据量不不是很大,但是如果限制到了 lgn 就很容易想象到应该是利用二分的思想来解决。暴力方法:遍历一遍,如果一个值得左右严格大于它本身,则一定是峰值 但主要向借这道题学习一个思考方式

# 【迭代爬坡】

这个方法其实很容易想到,但是由于他本身一定是 O (n) 的,所以也一定不是最终优化的解。 算法思想: 随机一个位置,然后根据左右是否比自己值大决定往哪个方向爬坡,因为峰顶一定是单调递增的,所以一旦爬坡到某点无法继续前进,那点就一定是峰顶 (* 排除边界情况)

# 【二分优化的迭代爬坡】

其实这个思路蛮巧妙的 因为迭代爬坡的特性,所以不管如何选值,只会有三种情况

  1. nums [i] < nums [i+1] 则峰值一定在 i 的右侧
  2. nums [i] > nums [i+1] 则峰值一定在 i 的左侧
  3. nums [i] 是峰值

第一种情况,我们可以直接针对这个 i 抛弃掉左侧区间所有的查询
第二种情况,我们可以直接针对这个 i 抛弃掉右侧区间所有的查询
这种方式类似于二分・其实本质上可以理解为・

# 拓展二分思维方式

针对一个问题,每次减少一半查询空间 即暂时理解的广义二分