搜索
您的当前位置:首页正文

852. 山脉数组的峰顶索引(Python)

来源:二三娱乐

题目

我们把符合下列属性的数组 A 称作山脉:

A.length >= 3
存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i 的值。

提示
3 <= A.length <= 10000
0 <= A[i] <= 10^6
A 是如上定义的山脉

示例

示例 1
输入:[0,1,0]
输出:1

示例 2
输入:[0,2,1,0]
输出:1

题目

我们使用二分法解决这个问题。

初始化考察的线段的左右端点:left=0,right=len(A)-1;

中点坐标:mid = left+(right-left)//2,中点左右相邻位置的坐标midl=mid-1,midr=mid+1;

通过中间处的连续三个元素查看趋势,山坡和山顶的区别:

山顶:中间位置元素比相邻左右元素都大,A[mid] > A[midl],A[mid]>A[midr];

山坡:中间及其相邻左右元素单调递增或递减,A[midl]<A[mid]<A[midr](左山坡)或者A[midl]>A[mid]>A[midr](右山坡)

对于左山坡,山顶在右半部分,我们去掉左半部分,考察右半部分;

对于右山坡,山顶在左半部分,我们去掉右半部分,考察左半部分。

class Solution:
    def peakIndexInMountainArray(self, A):
        """
        :param A: List[int]
        :return: int
        """
        left, right = 0, len(A)-1
        while True:
            mid = left + (right - left) // 2
            midl, midr = mid-1, mid+1
            if A[mid] > A[midl] and A[mid] > A[midr]:
                return mid
            elif A[midl] < A[mid] < A[midr]:            # 左侧山坡
                left = mid + 1
            elif A[midl] > A[mid] > A[midr]:            # 右侧山坡
                right = mid - 1

如有疑问或建议,欢迎评论区留言~

Top