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:
- 先由小到大遍历,找到山顶的数组下标索引
- 再由大到小遍历,如果最终的结果完全等于数组的最后一位的下标索引,返回
true
- 反之,返回
false
如果你也这么想,大概代码实现起来是这个样子:
/*
* @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
不难发现,在找到山顶下标时,还需要个判断!
于是,revised code
孕育而生:
/*
* @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: