力扣 845. 数组中的最长山脉

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

  • arr.length >= 3
  • 存在下标 i0 < 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

题解

 遍历元素,轮流做山峰,每个山峰确定后,分布向左、右去寻找长度,为了减少搜索次数,

仅当当前山峰满足基本条件arr[i]>arr[i-1]&&arr[i]>arr[i+1]时才使用两个指针l r向左、右搜索,

每个山峰搜索后记录当前长度cnt,比较并更新最大值res

  • 往左:当arr[l+1]>arr[l],继续往左走,使用while循环;
  • 往右:当arr[r]<arr[r-1],继续往右;

 搜索中,移动指针时将cnt++

查看代码
class Solution {
public:
    int longestMountain(vector<int>& arr) {
        int res=0;
        for(int i=1;i<arr.size()-1;i++){
            if(arr[i]>arr[i-1]&&arr[i]>arr[i+1]){
                int l=i-2,r=i+2;
                int cnt=3;//至少有三个
                while(l>=0&&arr[l+1]>arr[l]){
                    cnt++;
                    l--;
                }
                while(r<arr.size()&&arr[r]<arr[r-1]){
                    cnt++;
                    r++;
                }
                if(cnt>res)
                    res=cnt;
            }  
        }
        return res;
    }
};

 

posted @ 2022-04-05 21:48  付玬熙  阅读(51)  评论(0编辑  收藏  举报