Let's call any (contiguous) subarray B (of A) a mountain if the following properties hold:
* B.length >= 3
* There exists some 0 < i < B.length - 1 such that B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]
(Note that B could be any subarray of A, including the entire array A.)
Given an array A of integers, return the length of the longest mountain. 
Return if there is no mountain.
Example 1:
Input: [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: [2,2,2]
Output: 0
Explanation: There is no mountain.


Follow up:
* Can you solve it using only one pass?
* Can you solve it in O(1) space?



Updated list of problems that involved 1 or 2 passes from left to right/right to left:

53 Maximum Subarray
121 Best Time to Buy and Sell Stock
152 Maximum Product Subarray
238 Product of Array Except Self
739 Daily Temperatures
769 Max Chunks to Make Sorted
770 Max Chunks to Make Sorted II
821 Shortest Distance to a Character
845 Longest Mountain in Array

// accepted 
// three pass 
class Solution {
    public int longestMountain(int[] A) {
        int n = A.length;
        int res = 0;
        int[] left = new int[n];
        int[] right = new int[n];
        for(int i = 0; i < n; i++){
            if(i > 0 && A[i] > A[i - 1]){
                left[i] = left[i - 1] + 1;
            }
        }
        
        for(int i = n - 2; i >= 0; i--){
            if(A[i] > A[i + 1]){
                right[i] = right[i + 1] + 1;
            }
        }
        for(int i = 0; i < n; i++){
            if(left[i] > 0 && right[i] > 0){
                res = Math.max(res, left[i] + right[i] + 1);
            }
        }
        return res;  
    }
}



// accepted 
// two passes 
class Solution {
    public int longestMountain(int[] A) {
        int n = A.length;
        int res = 0;
        int[] left = new int[n];
        int[] right = new int[n];
        for(int i = 0; i < n; i++){
            if(i > 0 && A[i] > A[i - 1]){
                left[i] = left[i - 1] + 1;
            }
        }
        
        for(int i = n - 2; i >= 0; i--){
            if(A[i] > A[i + 1]){
                right[i] = right[i + 1] + 1;
                if(left[i] > 0 && right[i] > 0){
                    res = Math.max(res, left[i] + right[i] + 1);
                }
            }
        }
        return res;  
    }
}







 

2,1,4,7,3,2,5

0 0 1 20 0 1

1  0 0 21 00