【题目】
给定一个整数数组 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
【代码】
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int dingpos=0,len=arr.size();
for(int i=1;i<len;i++)
if(arr[i]<arr[i-1]){
dingpos=i-1;
break;
}
else if(arr[i]==arr[i-1])
return false;
if(dingpos<len&&dingpos>0){
for(int i=dingpos+1;i<len;i++){
if(arr[i-1]<=arr[i])
return false;
}
}else
return false;
return true;
}
};
【时间效率略微提高了一丢丢】
基本思想:先找出最大数的下标,然后将数组的比较分为两个阶段,第一阶段,依次递增,第二阶段,依次递减。
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int maxpos=0,len=arr.size();
for(int i=1;i<len;i++)
if(arr[i]>arr[maxpos])
maxpos=i;
if(maxpos==0||maxpos==len-1)
return false;
for(int i=1;i<=maxpos;i++)
if(arr[i]<=arr[i-1])
return false;
for(int i=maxpos+1;i<len;i++)
if(arr[i-1]<=arr[i])
return false;
return true;
}
};
【双向遍历】
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int l=0,len=arr.size(),r=len-1;
while(l<len-1&&arr[l+1]>arr[l])
l++;
while(r>0&&arr[r-1]>arr[r])
r--;
if(l==len-1||r==0)
return false;
return l==r;
}
};