第二十七天:力扣第941题,有效的山脉数组
思路:一开始就两个思路,从两边找到最大值,判断是否一样的位置;从最大值往两边遍历,能否遍历完。
方法一:
var validMountainArray = function(A) {
let left;
let right;
for(left = 0; left < A.length - 1; left++)
{
if(A[left] == A[left + 1])
{
return false;
}
else if(A[left] > A[left + 1])
{
break;
}
}
for(right = A.length - 1; right > 1; right--)
{
if(A[right] == A[right - 1])
{
return false;
}
else if(A[right] > A[right - 1])
{
break;
}
}
if(right!=0&&left!=A.length-1&&left==right)
{
return true;
}
return false;
};
方法二:
var validMountainArray = function(A) {
let a = A.indexOf(Math.max(...A));//找出最大值位置
if(a == 0||a == A.length-1)
{
return false;
}
let left = a;
let right = a;
while(left > 0)
{
if(A[left] <= A[left-1])
{
return false;
}
left--;
}
while(right < A.length - 1)
{
if(A[right]<=A[right + 1])
{
return false;
}
right++;
}
return true;
};
不过时间和空间复杂度都不尽人意。
官方给的线性扫描,确实要快点
var validMountainArray = function(A) {
const N = A.length;
let i = 0;
// 递增扫描
while (i + 1 < N && A[i] < A[i + 1]) {
i++;
}
// 最高点不能是数组的第一个位置或最后一个位置
if (i === 0 || i === N - 1) {
return false;
}
// 递减扫描
while (i + 1 < N && A[i] > A[i + 1]) {
i++;
}
return i === N - 1;
};