我試圖解決頂級編碼器上的問題鋸齒形序列。我的代碼的時間複雜度是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不是之字形序列,第一個是因爲它的前兩個差值是正值,第二個是因爲它的最後差值是零。
給定一個整數序列序列,返回Zig-zag序列中最長的序列子序列的長度。通過從原始序列中刪除一些元素(可能爲零)來獲得子序列,其餘元素保持其原始順序。
這裏是我的代碼
#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]);
}
};
O(n)我想盡量減少 – prince