leetcode刷题845.数组中的最长山脉

我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:

B.length >= 3

存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]

(注意:B 可以是 A 的任意子数组,包括整个数组 A。)

给出一个整数数组 A,返回最长 “山脉” 的长度。

如果不含有 “山脉” 则返回 0。

示例 1:

输入:[2,1,4,7,3,2,5]

输出:5

解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。

 

示例 2:

输入:[2,2,2]

输出:0

解释:不含 “山脉”。

思路:双指针,用两个指针l, r指向山脉的起点和终点,遍历一遍数组,不断更新l,r的值,如果上一个山脉终点为r,则下一次遍历的起点为r,如果r==l,下一次起点应+1

实现

class Solution {
public:
    int longestMountain(vector<int>& A) {
        int n = A.size(), ans=0, l=0, r=0;
      
        while (l<n) //l,r分别记录山峰的起点和终点
        {
            if (l<n-1&&A[l]<A[l+1]) //山峰起点
            {
                r = l;
                while (r<n-1&&A[r]<A[r+1])  r++;

                if (r<n-1&&A[r]>A[r+1]) //此时r为峰点
                {
                    while (r<n-1&&A[r]>A[r+1]) r++; //顺着峰点下降,找到终点
                    ans = max(ans, r-l+1);  //更新最长山脉长度
                }
            }
            l = max(l+1,r); //更新下一个山脉的起点
        }
        return ans;
    }
};

链接:https://leetcode-cn.com/problems/longest-mountain-in-array

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值