【Leetcode】845. Longest Mountain in Array

tech2025-02-24  15

题目地址:

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

给定一个数组 A A A,求其最长的子数组 B B B,满足以下条件: 1、 B B B的长度 l l l大于等于 3 3 3; 2、存在一个下标 i i i i ≠ 0 , l − 1 i\ne 0,l-1 i=0,l1,并且有 B [ 0 ] < B [ 1 ] < . . . < B [ i ] > B [ i + 1 ] > B [ i + 2 ] > . . . B [ l − 1 ] B[0]<B[1]<...<B[i]>B[i+1]>B[i+2]>...B[l-1] B[0]<B[1]<...<B[i]>B[i+1]>B[i+2]>...B[l1]

可以用双指针来做。慢指针 l l l 0 0 0出发,先略过相同的数字,然后停在一个位置 i i i使得 A [ i ] ≠ A [ i + 1 ] A[i]\ne A[i+1] A[i]=A[i+1],接着让快指针 r r r i + 1 i+1 i+1出发,先“爬山”,再“下山”,下山到了山底的时候,就可以停下来了,这是就可以更新找到的山的长度(即 r − l + 1 r-l+1 rl+1)。但需要注意的是,要求的子数组必须是既有上山也有下山的过程的,光有一个不行,所以还要开两个boolean变量,记录是否上山和下山过。遍历完这个山后,将 l l l移到 r r r的位置,继续上述过程,直到整个数组遍历完毕。代码如下:

public class Solution { public int longestMountain(int[] A) { // 判空 if (A == null || A.length == 0) { return 0; } // 开两个变量表示快慢指针,l慢r快 int l = 0, r = 0; // 记录已经找到的最长的山的长度 int res = 0; while (true) { // 先略过若干相同数字 while (l < A.length - 1 && A[l] == A[l + 1]) { l++; } // 如果l到达末尾了,就跳出循环 if (l == A.length - 1) { break; } // 让r从l后面一位开始向后走 r = l + 1; // 开两个boolean变量记录是否上过山和下过山 boolean up = false, down = false; // 先上山 while (r < A.length && A[r - 1] < A[r]) { r++; up = true; } // 再下山 while (r < A.length && A[r - 1] > A[r]) { r++; down = true; } // r退回一步到山脚 r--; // 如果既上过山也下过山,就返回山的长度 if (up && down) { res = Math.max(res, r - l + 1); } // 将慢指针移到山脚,然后继续后面的遍历 l = r; } return res; } }

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

最新回复(0)