LeetCode845数组中的最长山脉—–双指针


题目表述

把符合下列属性的数组 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 。

进阶:

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

双指针

1、初始化一个快指针fast和慢指针slow。
2、利用fast指针寻找递增字串,如果递增字串长度为0,则不可能为山脉,令slow = fast,接着从fast在找递增字串。
3、找到山脉上升部分后再接着从fast寻找下降山脉,设置变量down,记录下降山脉的个数,如果down==0,做无下降部分,也不能成为山脉。
4、记录山脉长度,fast – slow,寻找fast – slow过程中的最大值即可

class Solution {
    public int longestMountain(int[] arr) {
        int slow = 0;
        int fast = 1;
        int res = 0;
        while(fast < arr.length){
            while(fast < arr.length && arr[fast] > arr[fast - 1]){
                fast++;
            }
            if(fast == slow + 1){
                slow = fast;
                fast++;
                continue;
            }
            int down = 0;
            while(fast < arr.length && arr[fast] < arr[fast - 1]){
                fast++;
                down++;
            }
            if(down != 0)
                res = Math.max(fast - slow,res);
            
            slow = fast - 1;
        }
        return res;
    }
}

原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/245238.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论