LeetCode 845.数组中的最长山脉
把符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在下标 i(0 < 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^44
0 <= arr[i] <= 104^44
进阶:
你可以仅用一趟扫描解决此问题吗?
你可以用 O(1) 空间解决此问题吗?
分组循环,每一组是一个山脉:
class Solution {
public:int longestMountain(vector<int>& arr) {int n = arr.size();int ans = 0;int i = 0;while (i < n) {int start = i;++i;// 如果一上来就下降或保持水平,则一定不是山脉组起点if (i < n && arr[i] <= arr[start]) {continue;}// 上升过程while (i < n && arr[i] > arr[i - 1]) {++i;}// 如果到了山顶后,后面没有数字了,或者是平顶山,则一定也不是山脉组if (i == n || arr[i] == arr[i - 1]) {continue;}// 下降过程while (i < n && arr[i] < arr[i - 1]) {++i;}ans = max(ans, i - start);// 如果右山脚低于右边紧邻位置,则下次从右山脚开始找山脉组if (i < n && arr[i] > arr[i - 1]) {--i;}}return ans;}
};
如果arr的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。