我试图解决顶部编码器上的锯齿形序列问题。我的代码的时间复杂度是 O(n*n)。如何将其减少到 O(n) 或 O(nlog (n)) 伪代码或算法解释对我真的很有帮助这是问题陈述。问题陈述
如果连续数字之间的差异在正负之间严格交替,则数字序列称为之字形序列。第一个差异(如果存在)可以是正面的也可以是负面的。少于两个元素的序列通常是锯齿形序列。
例如,1,7,4,9,2,5 是锯齿形序列,因为差值 (6,-3,5,-7,3) 交替出现正负。相反,1,4,7,2,5 和 1,7,4,5,5 不是之字形序列,第一个是因为它的前两个差是正数,第二个是因为它的最后一个差是零。
给定一个整数序列,sequence,返回序列的最长子序列的长度,即锯齿形序列。子序列是通过从原始序列中删除一些元素(可能为零)而获得的,而其余元素则保持其原始顺序。
这是我的代码
#include <iostream>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
class ZigZag
{
public:
int dp[200][2];
void print(int n)
{
for(int i=0;i<n;i++)
{
cout<<dp[i][0]<<endl;
}
}
int longestZigZag(vector<int> a)
{
int n=a.size();
//int dp[n][2];
for(int i=0;i<n;i++)
{
cout<<a[i]<<" "<<"\t";
}
cout<<endl;
memset(dp,sizeof(dp),0);
dp[0][1]=dp[0][0]=1;
for(int i=1;i<n;i++)
{
dp[i][1]=dp[i][0]=1;
for(int j=0;j<i;j++)
{
if(a[i]<a[j])
{
dp[i][0]=max(dp[j][1]+1,dp[i][0]);
}
if(a[j]<a[i])
{
dp[i][1]=max(dp[j][0]+1,dp[i][1]);
}
}
cout<<dp[i][1]<<"\t"<<dp[i][0]<<" "<<i<<endl;
//print(n);
}
cout<<dp[n-1][0]<<endl;
return max(dp[n-1][0],dp[n-1][1]);
}
};