给定一个长度为 n 的正整数数组,每个元素表示一座山的高度。
其中满足以下条件的连续子数组称为山脉:
1.长度大于等于3
2.存在下标 i ,满足 nums[0] < nums[1] < nums[2] < ... < nums[i] , nums[i] > nums[i+1] > nums[i+2] ... > nums[i+k]
请你找出最长山脉的长度
数据范围:
, 数组中的元素满足
[2,5,2,1,5]
4
[2,5,2,1]
[2,2,2,2,1]
0
没有山脉则输出 0
这个题目可以通过遍历数组来解决,寻找满足条件的最长山脉。我们需要记录每座山脉的起点、峰值和终点,并计算最大长度。
思路如下:
nums[i]
是峰值,当它满足 nums[i - 1] < nums[i] > nums[i + 1]
。 right - left + 1
,并更新最长山脉长度。 0
。 代码实现如下:
import java.util.ArrayList; public class Solution { public int longestmountain(ArrayList<Integer> nums) { int n = nums.size(); if (n < 3) return 0; // 至少需要三个元素形成山脉 int maxLength = 0; for (int i = 1; i < n - 1; i++) { // 判断是否为山峰 if (nums.get(i - 1) < nums.get(i) && nums.get(i) > nums.get(i + 1)) { int left = i - 1; int right = i + 1; // 向左扩展 while (left > 0 && nums.get(left - 1) < nums.get(left)) { left--; } // 向右扩展 while (right < n - 1 && nums.get(right + 1) < nums.get(right)) { right++; } // 计算当前山脉长度 int currentLength = right - left + 1; maxLength = Math.max(maxLength, currentLength); } } return maxLength; } }
maxLength
记录最长山脉的长度。 import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型ArrayList * @return int整型 */ public int longestmountain (ArrayList<Integer> nums) { int count = 0; int res = 0; nums.add(10001); for (int i = 1; i < nums.size(); i++) { if (nums.get(i) > nums.get(i - 1)) { count++; } if (nums.get(i) < nums.get(i - 1)) { count++; if (nums.get(i) <= nums.get(i + 1)) { res = Math.max(res, count + 1); count = 0; } } } return res; } }