《最长凹谷》绿盟杯
有一维数组X = [8,5,1,6,7,7,3,5],我们把它画到坐标系中,其中凹下去的部分我们称为X数组的凹谷数组Y,其中凹陷的长度即为凹谷数组的长度(Y的长度大于3),其中持平的部分不计入凹谷数组的长度。如下所示,X有两个凹谷数组Y1 = [8,5,1,6,7]和Y2 = [7,3,5],长度分别为5和3。我们则需要返回这个数组中的最长凹谷数组的长度,即5,如果数组中不含凹谷,则返回0。
public class Task {
public int concaveValley(Integer[] arr){
int max=0;
int now1=0;
int now2=0;
//low用于记录凹谷位置
//若为负数则不是凹谷
int[] low=new int[arr.length];
for(int i=0;i<arr.length;i++)
{
low[i]=-1;
}
int j=0;
for(int i=1;i<arr.length-1;i++)
{
//记录凹谷的位置
if(arr[i]<arr[i-1]&&arr[i]<arr[i+1])
{
low[j]=i;
j++;
}
}
//计算每个凹谷的长度,我这里是分左右两边来记的
for(int i=0;i<arr.length;i++)
{
if(low[i]>0)
{
for(int m=low[i];m>0;m--)
{
if(arr[m]<arr[m-1])
now1=now1+1;
else
break;
}
for(int n=low[i];n<arr.length-1;n++)
{
if(arr[n]<arr[n+1])
now2=now2+1;
else
break;
}
if(max<now1+now2+1)
{max=now1+now2+1;
now1=0;
now2=0;
}
}
}
return max;
}
}