一句话解题思路:
找出数组中的最大值,从最大值处把原数组分为两个数组看待,如果左边数组中有任何一个元素小于或者等于该元素前面的元素,那么就非山脉数组,右边数组同理。
详细解释:
1. 找出边缘或者极端现象:
如果数组元素个数小于3,那就非山脉数组。
2. 找出数组最大值:
如果最大值是数组的第一个元素或者最后一个元素,那数组就非山脉数组。
3. 从最大值处把原数组分为两个数组看待:
左边数组从下标为0开始到原数组最大值的下标止;
右边数组从原数组最大值下标起,到原数组最后一个元素的下标止。
创建两个指针,分别遍历左边和右边部分的元素,如果最大值左边有元素大于或等于该元素后面的元素,那么返回false(即原数组非山脉数组),右边部分同理,也就是说如果最大值右边有元素小于或等于该元素后面的元素,那就返回false。
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int max=0;
int index=0;
bool flag1=false;
bool flag2=false;
//题目要求,数组至少要有三个元素,所以少于3个元素的,返回false
if(arr.size()<3)
{
return false;
}
//数组大于三个元素
//先找出最大数的下标
for(int i=0;i<arr.size();i++)
{
if(arr[i]>max)
{
max=arr[i];
index = i;
}
}
//如果最大值是数组的第一个元素或者最后一个元素,那数组就非山脉数组。
if(index==0||index==arr.size()-1)
{
return false;
}
//创建两个指针,分别遍历左边和右边部分的元素
//如果最大值左边有元素大于或等于该元素后面的元素,那么返回false(即原数组非山脉数组)
for(int j=0;j<index;j++)//左边数组从下标为0开始到原数组最大值的下标止
{
if(arr[j]>=arr[j+1])
{
return false;
}
}
//右边数组从原数组最大值下标起,到原数组最后一个元素的下标止
//如果最大值右边有元素小于或等于该元素后面的元素,那就返回false。
for(int k=index; k<arr.size()-1;k++)
{
if(arr[k]<=arr[k+1])
{
return false;
}
}
return true;
}
};