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
解释:不含 “山脉”。
 

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-mountain-in-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

1:遍历数组。

2:用一个布尔型flag来记录当前时上升(true)还是下降(false)。 用一个int count 来记录当前山峰的长度。 用一个int max 来记录最大值。

3:若是遇到递增的,若之前时递增,则count + 1.若之前是递减,则count 于max比较,并重置count。falg

4:若遇到递减,若之前是递增,则改变flag值,count + 1。若之前是递减,则count+ 1.

5:若遇到的值= 上一个值,则重置flag 和count.

    public int longestMountain(int[] arr) {
        boolean flag = true;
        int count = 1;
        int max = 0;
        for (int i = arr.length - 2; i >= 0; i--) {
            if (arr[i] > arr[i + 1]) {
                if (flag) {
                    count++;
                } else {
                    max = Math.max(max, count);
                    count = 2;
                    flag = true;
                }
            } else if (arr[i] < arr[i + 1]) {
                if (flag && count == 1) {
                    continue;
                }
                count++;
                flag = false;
            } else {
                if (!flag) {
                    max = Math.max(max, count);
                }
                count = 1;
                flag = true;
            }
        }
        if (!flag) {
            max = Math.max(max, count);
        }
        return max;
    }

posted @ 2021-07-30 13:29  旺仔古李  阅读(129)  评论(0)    收藏  举报