LeetCode Everyday - 数组中的最长山脉

141 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 >>

数组中的最长山脉

把符合下列属性的数组 arr 称为 山脉数组 :

  • arr.length >= 3
  • 存在下标 i(0 < i < arr.length - 1),满足
    • arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
    • arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

给出一个整数数组 arr,返回最长山脉子数组的长度。如果不存在山脉子数组,返回 0 。

示例1:

输入: arr = [2,1,4,7,3,2,5]
输出: 5
解释: 最长的山脉子数组是 [1,4,7,3,2],长度为 5

示例2:

输入: arr = [2,2,2]
输出: 0
解释: 不存在山脉子数组。

提示:

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 104

进阶:

  • 你可以仅用一趟扫描解决此问题吗?
  • 你可以用 O(1) 空间解决此问题吗?

解题思路:

pos 存储方向,0-初始 1-上升 2-下降
maxLen 最大长度

1、开始记录长度是从向上开始到向下转向上的前一个位置或者最后一个位置
2、当转向下时是否出现过相等的情况,是-pos重置为0
3、向下时是否有相等,是-pos重置为0

我的答案:

/**
 * @param {number[]} arr
 * @return {number}
 */
var longestMountain = function (arr) {
    // 如果数组长度小于3, 直接返回0
    if (arr.length < 3) {
        return 0;
    }
    let startIndex = 0;
    let maxLen = 0;
    let pos = 0; // 0- 初始 1-上升 2-下降
    // 循环数组判断是什么状态
    for (let i = 0; i < arr.length - 1; i++) {
        if (pos === 0 && arr[i + 1] > arr[i]) {
            pos = 1;
            startIndex = i;
        }
        if (pos === 1) {
            if (arr[i + 1] === arr[i]) {
                pos = 0;
            }
            if (arr[i + 1] < arr[i]) {
                pos = 2;
            }
        }
        if (pos === 2) {
            if (arr[i + 1] >= arr[i]) {
                pos = 1;
                maxLen = Math.max(maxLen, i - startIndex + 1)
                startIndex = i;
                if (arr[i + 1] === arr[i]) {
                    pos = 0;
                }
            } else if (i + 1 === arr.length - 1) {
                maxLen = Math.max(maxLen, i - startIndex + 2)
            }

        }
    }

    return maxLen
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )