我们把数组 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-mountain-in-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
此题可以采用动态规划,根据题意山脉中左侧单调递增,右侧单调递减,可以使用两个数组left与right,left[i]表示在数组A中从位置i开始往左侧扩充满足A[i] > A[i - 1]最多可以扩充多少个,right[i]表示在数组A中从位置i开始往右侧扩充满足A[i] > A[i + 1]最多可以扩充多少个,显然left[0]和right[A.size() - 1]均为0,状态转移方程为
从左到右迭代求解left数组,从右到左求解right数组,最终的山脉长度
代码
class Solution {
public:
int longestMountain(vector<int>& A) {
if (A.size() < 3) {
return false;
}
vector<int> left(A.size(), 0);
vector<int> right(A.size(), 0);
left[0] = 0;
right[A.size() - 1] = 0;
for (int i = 1; i < A.size(); ++i) {
if (A[i] > A[i - 1]) {
left[i] = left[i - 1] + 1;
} else {
left[i] = 0;
}
}
for (int i = A.size() - 2; i >= 0; --i ) {
if (A[i] > A[i + 1]) {
right[i] = right[i + 1] + 1;
} else {
right[i] = 0;
}
}
int length = 0;
for (int i = 0; i < A.size(); ++i) {
int len = (left[i] > 0 && right[i] > 0 ? left[i] + right[i] + 1 : 0);
if (len > length) {
length = len;
}
}
return length;
}
};