#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)
/*
* 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
}
}