LeetCode 题解:845. Longest Mountain in Array

Let’s call any (contiguous) subarray B (of A) a mountain if the following properties hold:

  • B.length >= 3
  • There exists some 0 < i < B.length - 1 such that B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1] (Note that
    B could be any subarray of A, including the entire array A.)

Given an array A of integers, return the length of the longest mountain.

Return 0 if there is no mountain.

Example 1:

Input: [2,1,4,7,3,2,5]
Output: 5
Explanation: The largest mountain is [1,4,7,3,2] which has length 5.

Example 2:

Input: [2,2,2]
Output: 0
Explanation: There is no mountain.

解题思路

从左往右遍历数组,子区间长度用 [ left, right] 表示,leftright 初始化为0,有五步操作:

  1. **检测递增区间:**假如A[right + 1] > A[right],说明序列递增,子区间右边界右移一位;否则,说明当前A[right]是此子序列的最大项,转至第二步。

  2. 假如 leftright 相等,说明子区间中不是以递增序列开始,整个子区间往右移一位,转至第一步;否则,转至第三步。

  3. **检测递减区间:**假如A[right + 1] < A[right],说明序列递减,子区间右边界右移一位;否则,说明当前A[right]是此子序列的最小项,转至第四步。

  4. 假如此时的 right 和初始值相等,说明子区间中不是以递减序列结束,清空子区间并从当前位置的下一位开始新的子区间,转至第一步;否则,转至第五步。

  5. 当前子区间的长度为right - left + 1,与当前最大子区间长度 maxCount 作比较。清空子区间并从当前位置的下一位开始新的子区间。若已经遍历完成,跳出循环并返回;否则,转至第一步。

C++代码

class Solution {
public:
    int longestMountain(vector<int>& A) {
        int left = 0, right = 0;
        int maxCount = 0, rec = 0;
        
        while(right < A.size()) {
            while(right < A.size() && A[right+1] > A[right]) right++;
            if(right == left) {
                left++;
                right++;
                continue;
            }
            rec = right;
            while(right + 1 < A.size() && A[right+1] < A[right]) right++;
            if(right == rec) {
                right++;
                left = right;
                continue;
            }
            maxCount = max(maxCount, right - left + 1);
            left = right;
        }
        
        return maxCount;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTao-z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值