[Leetcode学习-java] Longest Mountain in Array

博客围绕数组中找出最长波峰区间的问题展开,问题要求输入数组后找出有波峰的区间,平波不算长度。作者使用滑动窗口算法解决该问题,具有O1空间和On时间复杂度,还阐述了区分上下坡阶段、下坡重设起点、平坡重设起点等要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

难度:Medium

说明:

题目输入一个数组,然后找出数组内 有波峰 的一个区间,称之为山峰,返回最长的一个 波峰,其中平波不算入长度。

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

相关算法:

[Leetcode学习-java]Consecutive Characters(找到最长重复字符子串):https://blog.youkuaiyun.com/qq_28033719/article/details/109486014

[Leetcode学习-java]Find All Anagrams in a String(获取所有异序词):https://blog.youkuaiyun.com/qq_28033719/article/details/106194878

 

输入范围:

  1. 0 <= A.length <= 10000
  2. 0 <= A[i] <= 10000

输入案例:

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.

我的代码:

我也是使用滑动窗口算法,O1空间和On时间复杂度,真的太合适了,没有优化写了一次,蒙对了。

1、区分上坡下坡两个阶段,而且必定是先上坡,后下坡。

2、任何下坡,区间一定会延伸到下一个上坡的起点 + 1 处,所以任何下坡状态都重设 起点

3、平坡重设起点

class Solution {
    public int longestMountain(int[] A) {
        boolean up = false, down = false;
        int begin = 0, end = 1, len = A.length, max = 0;
        for(;end < len;end ++) {
            while(end < len && A[end] < A[end - 1]) {
                end ++;
                down = true;
            }
            if(up && down) {
                max = Math.max(end - begin, max);
            }
            if(down) {
                begin = end - 1;
            }
            if(end < len && A[end] > A[end - 1]) {
                up = true;
                down = false;
            } else {
                begin = end;
                up = down = false;
            }
        }
        return max;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值