山脉数组的峰顶索引
山脉数组的峰顶索引
https://leetcode.cn/problems/peak-index-in-a-mountain-array/
思路
题目要求时间复杂度为\(O(log(n))\),所以不能通过遍历的方法找极值点。实际上,可以使用二分法
我们使用「二分」进行查值,需要确保序列本身满足「二段性」:当选定一个端点(基准值)后,结合「一段满足 & 另一段不满足」的特性来实现“折半”的查找效果。
本题的数组就满足二段性,极值点的左边是递增数列,极值点的右边是递减数列。
结合二分查找中的写法,将红色区域定义为递增数列,蓝色区域定义为递减数列
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
l, r = -1, len(arr)
arr.append(arr[-1] - 1)
while l + 1 != r:
m = (l + r) // 2
if arr[m] < arr[m + 1]:
l = m
else:
r = m
return r
思考
第一次学习二分查找的时候,例子是查找有序数组中的某个数,于是理所应当的认为,二分查找只能查找某个值。后来深入的学习后才发现,原来二分查找还可以查第一个大于等于某个数的位置,第一个小于等于某个数的位置,最后一个大于等于某个数的位置,最后个小于等于某个数的位置。做了今天这道题,忽然又发现:原来二分查找还可以查不是有序的序列。