题目:
如果一个整型数组A的连续子数组B满足以下性质,那么我们把这个子数组成为“山峰”
len(B)>=3
存在一个变量i,0<i<len(B)-1,B[0]<…B[i]>…B[len(B)-1]
B有可能是A的全集
现在给出一个数组A,找出最长的山峰长度
如果没有山峰就输出0
输入:
N 数组大小
N个数字 表示数组元素
输出:
最长的山峰长度
方法:动态规划
思路:
转换成两部分的一维动态规划
(1)左边连续上升:如果右边的数>左边的数,于是left右=left左+1;
(2)右边连续下降:如果左边的数>右边的数,于是right左=right右+1;
如果不满足,每个地方初始化为1
然后定义max,来遍历数组,求出right+left最大的下标
最后因为山峰算了两遍,所以要减去一
如果最后max没有>=3&&这个点的left和right没有同时>=2,就无法构成山峰
代码:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i <n ; i++) {
nums[i]=sc.nextInt();
}
System.out.println(mount(nums));
}
public static int mount(int[] array) {
int[] left = new int[array.length];//上升子序列
int[] right = new int[array.length];//上升子序列
//上升子序列
left[0]=1;
for (int i = 1; i <array.length ; i++) {
if(array[i]>array[i-1]){
left[i]=left[i-1]+1;
}else{
left[i]=1;
}
}
//下降子序列
right[array.length-1]=1;
for (int i = array.length-2; i>=0 ; i--) {
if(array[i]>array[i+1]){
right[i]=right[i+1]+1;
}else{
right[i]=1;
}
}
int max=0,j;
for (int i = 0; i <array.length ; i++) {
if(max<left[i]+right[i]){
max=left[i]+right[i];
j=i;
}
}
if(max>=4&&right[j]>=2&&left[j]>=2){
return max-1;
}
return 0;
}