更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。
组队打卡,更多解法等你一起来参与哦!
LeetCode 845. 数组中的最长山脉,难度中等。
双向扫描
解题思路:我们首先需要找到所有的递增子数组和递减子数组,如果一个位置同时满足递增和递减的条件,那么我们就找到了一个山脉。最后通过计算该山脉的长度,并更新最大值。
class Solution {
public int longestMountain(int[] arr) {
if (arr.length < 3) return 0;
int[] up = new int[arr.length];
int[] down = new int[arr.length];
// 寻找左脉递增序列
for (int i = 1; i < arr.length; ++i) {
if (arr[i] > arr[i - 1]) {
up[i] = up[i - 1] + 1;
}
}
// 寻找右脉递减序列
for (int i = arr.length - 2; i >= 0; i--) {
if (arr[i] > arr[i + 1]) {
down[i] = down[i + 1] + 1;
}
}
int result = 0;
for (int i = 1; i < arr.length - 1; ++i) {
// 判断 i 是否是山顶
if (up[i] > 0 && down[i] > 0) {
// 左山脉 + 右山脉 + 山顶
result = Math.max(result, up[i] + down[i] + 1);
}
}
return result;
}
}