class Solution {
public int longestMountain(int[] arr) {
if(arr.length<3) return 0;
// 最初思路:
//找到一个数使左边都小于它右边都大于它?
// 锚点左边的数:左边都小于它,右边都大于它
// 锚点右边的数:左边都大于它,右边都小于它
// 锚点:大于左右两边的数字
// 找这样数字的边界,计算边界的长度
// 从数组中间开始往两边找?1.如果中间的数字,正好大于左右两边,就是锚点然后找左右边界即可。2.如果中间的数字左小右大,锚点在右边,否则锚点在左边
// 参考官方:动态规划
// 一个数组记录从左到右以某个数为结尾的最长连续递增序列长度
// 一个数组记录从右到左以某个数为结尾的最长连续递增序列长度
// 最后记录 长度 left[i]+right[i]-1
// 定义两个数组记录递增序列
int n = arr.length;
int[] left = new int[n];
int[] right = new int[n];
// 初始化里面的值为1
Arrays.fill(left,1);
Arrays.fill(right,1);
// 遍历找最长递增序列
for(int i =1;i<n;i++){
if(arr[i]>arr[i-1]){
// 记录当前递增序列长度,为前一个的值+1
left[i] = left[i-1]+1;
}
}
for(int j = n-1-1;j>=0;j--){
if(arr[j]>arr[j+1]){
right[j] = right[j+1]+1;
}
}
// 找同大于零的锚点,找最长子序列
int ans = 0;
for(int i = 0; i<n;i++){
if(left[i]>1 && right[i]>1){
ans = Math.max(ans,left[i]+right[i]-1);
}
}
return ans;
}
}
每日一道Leetcode - 845. 数组中的最长山脉 【动态规划】
最新推荐文章于 2021-10-11 08:25:11 发布