力扣941. 有效的山脉数组(线性扫描)
线性规划
按题意模拟即可。我们从数组的最左侧开始向右扫描,直到找到第一个不满足 A[i] < A[i + 1] 的下标 i,那么 i 就是这个数组的最高点的下标。如果 i=0 或者不存在这样的 i(即整个数组都是单调递增的),那么就返回 false。否则从 i 开始继续向右扫描,判断接下来的的下标 j 是否都满足 A[j]>A[j+1],若都满足就返回 true,否则返回 false。
复杂度分析
-
时间复杂度:O(N),其中 N 是数组 A 的长度。
-
空间复杂度:O(1)。
//
// main.cpp
// 941validMountainArray
//
// Created by MXQ on 2020/11/3.
//
#include <iostream>
#include "vector"
using namespace std;
class Solution {
public:
bool validMountainArray(vector<int>& A) {
int n=A.size();
if (n<3) {
return false;
}
int mount=0;
int i=1;
//上山
while (i<n) {
if (A[i]>A[i-1]) {
mount=i;
i++;
continue;;
}
else{
break;
}
}
//最高点不能是数组的起始位置或最后一个位置
//最高点是数组的起始位置就是没有上山
//最高点是数组的最后一个位置就是没有下山
if (i==n || i==1) {
return false;
}
//下山
while (i<n) {
if (A[i]<A[i-1]) {
i++;
continue;;
}
else{
break;
}
}
if (i==n) {
return true;
}
else{
return false;
}
}
};
int main(int argc, const char * argv[]) {
// insert code here...
Solution s;
vector<int>A={0,3,2,1};
auto result=s.validMountainArray(A);
cout<<result<<endl;
std::cout << "Hello, World!\n";
return 0;
}