数组中的最长山脉
我们把数组 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。
class Solution {
public:
int longestMountain(vector<int>& A) {
if(A.size() < 3) {
return 0;
}
//三指针法
//left - 左山脉
//min - 山脉顶峰
//riht - 右山脉
int left = 0, mid = 0;
int right = 0;
int max_high = 0;
while(left < A.size()) {
//1、首先先寻找left为左 - 山脉顶端
mid = left + 1;
while(mid < A.size() && A[mid] > A[mid-1]) {
mid++;
}
mid--;
//2、寻找以mid为基准, right右山脉
right = mid + 1;
while(right < A.size() && A[right] < A[right-1]) {
right++;
}
right--;
//2、判断right-left是否大于2
if(left != mid && right != mid && right - left >= 2) {
//证明存在山脉长度
max_high = max(max_high, right - left + 1);
left = right;
}
else {
//不存在
if(left != right) { left = right; }
else { left++; }
}
}
return max_high;
}
};