845.数组中的最长山脉LeetCode
- 数组中的最长山脉
题目描述提示帮助提交记录社区讨论阅读解答
随机一题
我们把数组 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
方法#1:两个指针[
直觉:在不丧失一般性的前提下,一座山只能在前一座山结束后开始这是因为如果它开始于山峰之前,它会比之前的山要小;而且在高峰之后开始是不可能的。
算法:对于一个起始的索引基,让我们计算最长的山的长度a [base], a [base+1],…(结束),如果存在这样的山,下一个可能的山将从base = end开始;如果没有,那么要么我们到达终点,要么我们有一个[底]> A[底+1]我们可以从底+1开始。
例子:下面是数组a =[1,2,3,2,1,0,2,3,1]的工作示例:
base从o开始,end使用第一个while循环到达end =2 (A[end] =3),即这座山的潜在峰值。之后,它在第二个while循环中移动到end =5 (A[end] =0),并记录6 (base =0, end =5)的候选答案。然后将base设置为5,过程重新开始,end =7为山峰,end = 8为正确边界,记录4 (base = 5, end = 8)的候选答案。
class Solution {
public:
int longestMountain(vector<int>& A) {
int size=A.size();
int ans=0,base=0;
while(base<size){
int end=base;
if(end+1 <size && A[end]<A[end+1]){
while(end+1<size && A[end]< A[end+1]) end++;
if(end+1<size && A[end] >A[end+1]){
while(end+1<size && A[end] > A[end+1]) end++;
ans=max(ans,end-base+1);
}
}
base=max(end,base+1);
}
return ans;
}
};