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]
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
Thought:
- First traverse from small to large to find the array subscript index of the top of the mountain
- Then traverse from big to small, if the final result is completely equal to the subscript index of the last digit of the array, return
true
- Otherwise, return
false
If you think the same way, the code probably looks like this:
/*
* @lc app=leetcode.cn id=941 lang=cpp
*
* [941] 有效的山脉数组
*/
// @lc code=start
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int len = arr.size();
int i = 0;
while(i < len - 1 && arr[i] < arr[i + 1])
{
i++;
}
while(i < len - 1 && arr[i] > arr[i + 1])
{
i++;
}
return i == len - 1;
}
};
// @lc code=end
It is not difficult to find that when finding the subscript on the top of the mountain, a judgment is needed!
Thus, revised code
it was born:
/*
* @lc app=leetcode.cn id=941 lang=cpp
*
* [941] 有效的山脉数组
*/
// @lc code=start
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int len = arr.size();
int i = 0;
while(i < len - 1 && arr[i] < arr[i + 1])
{
i++;
}
if(i == len - 1 || i == 0)
{
return false;
}
while(i < len - 1 && arr[i] > arr[i + 1])
{
i++;
}
return i == len - 1;
}
};
// @lc code=end
AC: