请问有人能够帮我理解一个问题的解决方案背后的核心逻辑吗?问题描述见这里。
所谓Zig Zag序列是指交替上升和下降的序列,例如1 3 2就是Zig Zag序列,但1 2 3则不是。任何仅包含一个或两个元素的序列都是Zig Zag序列。我们需要在给定序列中找到最长的Zig Zag子序列。与最长递增子序列问题不同,子序列中的元素不必连续,例如1 3 5 4 2可以有1 5 4作为其Zig Zag子序列。我们对最长的子序列感兴趣。
我明白这是一个动态规划问题,并且它非常类似于如何使用动态规划确定最长递增子序列。
我认为任何解决方案都需要一个外部循环来迭代不同长度的序列,而内部循环将必须遍历所有序列。
我们将在另一个数组dpStore中存储以索引i结尾的最长Zig Zag序列,因此中间结果被存储下来,并且稍后可以重复使用。这部分对于所有动态规划问题都是相同的。然后我们找到全局最大值并返回它。
我自己的解决方案显然是错误的,在这里粘贴只是想知道我的错误在哪里。
private int isZigzag(int[] arr)
{
int max=0;
int maxLength=-100;
int[] dpStore = new int[arr.length];
dpStore[0]=1;
if(arr.length==1)
{
return 1;
}
else if(arr.length==2)
{
return 2;
}
else
{
for(int i=3; i<arr.length;i++)
{
maxLength=-100;
for(int j=1;j<i && j+1<=arr.length; j++)
{
if(( arr[j]>arr[j-1] && arr[j]>arr[j+1])
||(arr[j]<arr[j-1] && arr[j]<arr[j+1]))
{
maxLength = Math.max(dpStore[j]+1, maxLength);
}
}
dpStore[i]=maxLength;
}
}
max=-1000;
for(int i=0;i<arr.length;i++)
{
max=Math.max(dpStore[i],max);
}
return max;
}
1 3 5 4 2
中,整个序列是zig-zag
。您没有提及如何处理相等的数字,但是除了相等的数字,所有不是递增或递减的序列都不是zig-zag
子序列(除了平凡的 1 或 2 元素序列)。那么,1 1 1
是递增还是递减? - IVlad