000852-Peak-Index-in-a-Mountain-Array

Problem

https://leetcode.com/problems/peak-index-in-a-mountain-array/description/

An array arr a mountain if the following properties hold:

arr.length >= 3 There exists some i with 0 < i < arr.length - 1 such that: arr[0] < arr[1] < ... < arr[i - 1] < arr[i] arr[i] > arr[i + 1] > ... > arr[arr.length - 1] Given a mountain array arr, return the index i such that arr[0] < arr[1] < ... < arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1].

You must solve it in O(log(arr.length)) time complexity.

Example 1:

Input: arr = [0,1,0] Output: 1 Example 2:

Input: arr = [0,2,1,0] Output: 1 Example 3:

Input: arr = [0,10,5,2] Output: 1

Constraints:

3 <= arr.length <= 105 0 <= arr[i] <= 106 arr is guaranteed to be a mountain array.

Solution

It requires solves this problem in O(log(arr.length)), intuitive thought of binary search.

Binary search

class Solution:
    def peakIndexInMountainArray(self, arr: List[int]) -> int:
        l, r = 0, len(arr)-1
        
        while l <= r:
            m = (l+r)//2
            if arr[m-1] < arr[m] and arr[m+1] < arr[m]:
                return m
            elif arr[m+1] > arr[m]:
                l = m+1
            else:
                r = m-1
    
        return l

naive solution

loop through the arry

class Solution:
    def peakIndexInMountainArray(self, arr: List[int]) -> int:
        if not arr:
            return -1
        
        for i in range(1, len(arr)-1):
            if arr[i-1] < arr[i] and arr[i+1] < arr[i]:
                return i
        return -1

Last updated