力扣每日一题:有效的山脉数组

给定一个整数数组 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 A是有序的。他们有三个参数,其使用手法为:

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;
    }
};
原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/13917973.html