我的js算法爬坑之旅-有效的山脉数组

55 阅读1分钟

第二十七天:力扣第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;
};