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 0 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