Longest Mountain in Array [Medium] — Two Pass Expand

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem Statement

A mountain array has at least 3 elements, strict increase then strict decrease. Find the length of the longest mountain.

Input: [2,1,4,7,3,2,5]Output: 5 ([1,4,7,3,2])

Intuition

Two-pass scan:

  1. up[i] = length of increasing run ending at i
  2. down[i] = length of decreasing run starting at i

Mountain at i: up[i] > 0 and down[i] > 0, length = up[i]+down[i]+1.


Solutions

C++

int longestMountain(vector<int>& A) {
    int n=A.size(), ans=0;
    vector<int> up(n,0),down(n,0);
    for(int i=1;i<n;i++) if(A[i]>A[i-1]) up[i]=up[i-1]+1;
    for(int i=n-2;i>=0;i--) if(A[i]>A[i+1]) down[i]=down[i+1]+1;
    for(int i=0;i<n;i++) if(up[i]&&down[i]) ans=max(ans,up[i]+down[i]+1);
    return ans;
}

Python

def longestMountain(arr: list[int]) -> int:
    n = len(arr)
    up = [0]*n; down = [0]*n
    for i in range(1,n):
        if arr[i] > arr[i-1]: up[i] = up[i-1]+1
    for i in range(n-2,-1,-1):
        if arr[i] > arr[i+1]: down[i] = down[i+1]+1
    return max((up[i]+down[i]+1 for i in range(n) if up[i] and down[i]), default=0)

JavaScript

var longestMountain = function(arr) {
    const n=arr.length, up=new Array(n).fill(0), down=new Array(n).fill(0);
    for(let i=1;i<n;i++) if(arr[i]>arr[i-1]) up[i]=up[i-1]+1;
    for(let i=n-2;i>=0;i--) if(arr[i]>arr[i+1]) down[i]=down[i+1]+1;
    let ans=0;
    for(let i=0;i<n;i++) if(up[i]&&down[i]) ans=Math.max(ans,up[i]+down[i]+1);
    return ans;
};

Complexity

  • Time: O(n), Space: O(n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro