852. 山脈數(shù)組的峰頂索引(Python)

題目

難度:★★☆☆☆
類型:數(shù)組

我們把符合下列屬性的數(shù)組 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]
給定一個確定為山脈的數(shù)組,返回任何滿足 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;

中點坐標(biāo):mid = left+(right-left)//2,中點左右相鄰位置的坐標(biāo)midl=mid-1,midr=mid+1;

通過中間處的連續(xù)三個元素查看趨勢,山坡和山頂?shù)膮^(qū)別:

山頂:中間位置元素比相鄰左右元素都大,A[mid] > A[midl],A[mid]>A[midr];

山坡:中間及其相鄰左右元素單調(diào)遞增或遞減,A[midl]<A[mid]<A[midr](左山坡)或者A[midl]>A[mid]>A[midr](右山坡)

對于左山坡,山頂在右半部分,我們?nèi)サ糇蟀氩糠?,考察右半部分?/p>

對于右山坡,山頂在左半部分,我們?nèi)サ粲野氩糠?,考察左半部分?/p>

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]:            # 左側(cè)山坡
                left = mid + 1
            elif A[midl] > A[mid] > A[midr]:            # 右側(cè)山坡
                right = mid - 1

如有疑問或建議,歡迎評論區(qū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容