山脉数组的峰顶索引

山脉数组的峰顶索引

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

思考

第一次学习二分查找的时候,例子是查找有序数组中的某个数,于是理所应当的认为,二分查找只能查找某个值。后来深入的学习后才发现,原来二分查找还可以查第一个大于等于某个数的位置,第一个小于等于某个数的位置,最后一个大于等于某个数的位置,最后个小于等于某个数的位置。做了今天这道题,忽然又发现:原来二分查找还可以查不是有序的序列。

posted @ 2023-09-21 23:56  完美二叉树  阅读(27)  评论(0)    收藏  举报