845. Longest Mountain in Array

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 < = a r r . l e n g t h < = 10 4 1 <= arr.length <= 10^4 1<=arr.length<=104
  • 0 < = a r r [ i ] < = 10 4 0 <= arr[i] <= 10^4 0<=arr[i]<=104

From: LeetCode
Link: 845. Longest Mountain in Array


Solution:

Ideas:
  • Scan for a peak where arr[i-1] < arr[i] > arr[i+1].

  • From each peak, expand left while strictly increasing and right while strictly decreasing.

  • Track the maximum span; jump i to the end of the processed mountain.

  • Time O(n), space O(1).

Code:
int longestMountain(int* arr, int arrSize) {
    if (arrSize < 3) return 0;
    int i = 1, best = 0;

    while (i < arrSize - 1) {
        // Check if arr[i] is a peak
        if (arr[i - 1] < arr[i] && arr[i] > arr[i + 1]) {
            int l = i - 1;
            int r = i + 1;

            // Expand left (strictly increasing up to the peak)
            while (l > 0 && arr[l - 1] < arr[l]) l--;

            // Expand right (strictly decreasing after the peak)
            while (r < arrSize - 1 && arr[r] > arr[r + 1]) r++;

            int length = r - l + 1;
            if (length > best) best = length;

            // Skip to the end of this mountain to avoid reprocessing
            i = r;
        } else {
            i++;
        }
    }
    return best;
}
Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐