Skip to main content
Back to problems
#845
Medium Algorithms

Longest mountain in array

Array Two Pointers Dynamic Programming Enumeration
41.9% acceptance
Feb 22, 2026
3029
92
You may recall that an array arr is a mountain array if and only if: arr.length >= 3 There exists some index i (0-indexed) 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 an integer array arr, return the length of the longest subarray, which is a mountain. Return 0 if there is no mountain subarray.

Solution

Rust
Time O(n²)
Space O(1)
LeetCode
solution.rs
/*
 * You may recall that an array arr is a mountain array if and only if:
 * arr.length >= 3
 * There exists some index i (0-indexed) 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 an integer array arr, return the length of the longest subarray, which is a mountain. Return 0 if there is no mountain subarray.
 * Example 1:
 * Input: arr = [2,1,4,7,3,2,5]
 * Output: 5
 * Explanation: The largest mountain is [1,4,7,3,2] which has length 5.
 * Example 2:
 * Input: arr = [2,2,2]
 * Output: 0
 * Explanation: There is no mountain.
 * Constraints:
 * 1 <= arr.length <= 104
 * 0 <= arr[i] <= 104
 * Follow up:
 * Can you solve it using only one pass?
 * Can you solve it in O(1) space?
 */

impl Solution {
  pub fn longest_mountain(arr: Vec<i32>) -> i32 {
    let n = arr.len();
    if n < 3 { return 0; }
    let mut ans = 0;
    let mut i = 1;
    while i < n - 1 {
      if arr[i] > arr[i-1] && arr[i] > arr[i+1] {
        // Found a peak at i
        let mut left = i - 1;
        let mut right = i + 1;
        while left > 0 && arr[left-1] < arr[left] { left -= 1; }
        while right < n-1 && arr[right+1] < arr[right] { right += 1; }
        ans = ans.max((right - left + 1) as i32);
        i = right; // skip to end of this mountain
      } else {
        i += 1;
      }
    }
    ans
  }
}