> For the complete documentation index, see [llms.txt](https://anton-veselskyi.gitbook.io/codding-problems-solutions/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://anton-veselskyi.gitbook.io/codding-problems-solutions/leetcode/easy/valid-mountain-array.md).

# Valid Mountain Array

## [Valid Mountain Array](https://leetcode.com/problems/valid-mountain-array)

Given an array of integers `arr`, return *`true` if and only if it is a valid mountain array*.

Recall that arr is a mountain array if and only if:

* `arr.length >= 3`
* There exists some `i` 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]`

![](https://assets.leetcode.com/uploads/2019/10/20/hint_valid_mountain_array.png)

**Example 1:**

```
Input: arr = [2,1]
Output: false
```

**Example 2:**

```
Input: arr = [3,5,5]
Output: false
```

**Example 3:**

```
Input: arr = [0,3,2,1]
Output: true
```

**Constraints:**

* `1 <= arr.length <= 104`
* `0 <= arr[i] <= 104`

## Solutions

### 🧠 Cpp

```cpp
class Solution
{
public:
    //O(n) solution
    bool validMountainArray(vector<int>& A)
    {
        //empty is no mountain
        if(A.empty())
            return false;

        bool going_up = true;
        for(auto iter = ++begin(A); iter < end(A); ++iter)
        {
            //no flat
            if(*iter == *prev(iter))
               return false;

            //go up
            if(*prev(iter) < *iter)
            {
                //if we went up after we went down
                if(!going_up)
                    return false;
            }
            //go down
            else if(*prev(iter) > *iter )
            {
                //if we going down from the start
                if(prev(iter) == begin(A))
                    return false;
                //started to gow down
                if(going_up)
                    going_up = false;
            }           
        }

        //if we were going up all the time, return false
        return !going_up;

    }
};
```
