给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。
让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:
A.length >= 3
在 0 < i < A.length - 1 条件下,存在 i 使得:
A[0] < A[1] < ... A[i-1] < A[i]
A[i] > A[i+1] > ... > A[A.length - 1]
示例 1:
输入:[2,1]
输出:false
示例 2:
输入:[3,5,5]
输出:false
示例 3:
输入:[0,3,2,1]
输出:true
提示:
0 <= A.length <= 10000
0 <= A[i] <= 10000
通过做这个题了解的知识点:
1.vector的size()函数返回的是一个无符号整数,所以A.size()-1越界,是一个很大的数。 所以要用它的时候,最好是预先定义一个int型变量存储一下,即:
int n = A.size() - 1;
2.vector容器的首地址是 A.begin() , 尾地址是 A.end() , 而不是跟数组一样写数组名和数组名 + n ,n是数组元素个数
3.upper_bound()和lower_bound()函数的使用前提是数组或者vector
lower_bound(A.begin() , A.end() , x) - A ; //在整个vector容器中查找第一个大于等于x的数的下标
lower_bound(A , A + n , x) - A ; //在整个数组中查找第一个大于等于x的数的下标,n是数组元素个数
upper_bound(A.begin() , A.end() , x) - A ; //在整个vector容器中查找第一个大于x的数的下标
upper_bound(A , A + n , x) - A ; //在整个数组中查找第一个大于x的数的下标,n是数组元素个数
思路:
1.首先,数组元素个数小于3,则不是有效的。
2.如果有相邻元素相等的情况出现,则不是有效的。
3.这道题数据范围比较小,在这次直接遍历数组,找到第一个A[i] > A[i + 1]的情况,此时的i即为最大值的下标。
4.如果i是0或者A.size() - 1 , 即数组是单调递增或者单调递减的, 则不是有效的。
5.从最大值下标开始继续向后遍历数组,如果出现A[i] < A[i + 1] ,即元素递增情况 , 则不是有效的。
6.所有无效情况都不满足,即为有效的。
AC代码:
class Solution {
public:
bool validMountainArray(vector<int>& A) {
int n = A.size() ;
int x;
if(n < 3) return false;
for(int i = 0 ; i < n - 1 ; i ++){
if(A[i] == A[i + 1]) return false;
}
for(int i = 0 ; i < n - 1 ; i ++){
if(A[i] > A[i + 1]){
x = i;
break;
}
}
if(x == n - 1 || x == 0) return false;
for(int i = x ; i < n - 1 ; i ++){
if(A[i] < A[i + 1]) return false;
}
return true;
}
};