/**
 * Given an array A of integers, return true if and only if it is a valid mountain array.
 *
 * Recall that A is a mountain array if and only if:
 *
 * A.length >= 3
 * There exists some i with 0 < i < A.length - 1 such that:
 * A[0] < A[1] < ... A[i-1] < A[i]
 * A[i] > A[i+1] > ... > A[B.length - 1]
 *
 *
 * Example 1:
 *
 * Input: [2,1]
 * Output: false
 * Example 2:
 *
 * Input: [3,5,5]
 * Output: false
 * Example 3:
 *
 * Input: [0,3,2,1]
 * Output: true
 *
 *
 * Note:
 *
 * 0 <= A.length <= 10000
 * 0 <= A[i] <= 10000
 *
 * Memory complexity: O(1)
 * Time complexity: O(n)
 *
 */


public class ValidMountainArray {
    public boolean validMountainArray(int[] A) {
        if (A.length < 3) return false;
        boolean upwards = true;
        int up = 0;
        for (int i = 1; i < A.length; i++) {
            if (A[i] == A[i - 1]) return false;
            if (upwards) {
                if (A[i] < A[i - 1]) upwards = false;
                else up++;
            } else {
                if (A[i] > A[i - 1]) return false;
            }
        }
        return !upwards && up > 0;
    }

}