我必须找到一个数组最大增加子序列的长度,这样子序列的任何两个连续元素之间的差异是1 例如:{5,4,2,1,6,2,3,4,5} 最大连续增加子序列的长度:5 {1,2,3,4,5} 到目前为止,我试过这个:
#include <iostream>
using namespace std;
int a[1000001];
int m[1000001]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
m[a[i]]=i;
}
int maxm=0;
for(int i=1;i<=n;i++)
{
if(m[a[i]-1]==0 || m[a[i]]<=m[a[i]-1])
{
int k=a[i];
int prev = m[k];
k++;
int c=1;
while(m[k]>prev)
{
c++;
prev=m[k];
k++;
}
maxm=max(maxm,c);
}
}
cout<<maxm;
return 0;
}
#include <iostream>
using namespace std;
int a[1000001];
int m[1000001]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
m[a[i]]=i;
}
int maxm=0;
for(int i=1;i<=n;i++)
{
if(m[a[i]-1]==0 || m[a[i]]<=m[a[i]-1])
{
int k=a[i];
int prev = m[k];
k++;
int c=1;
while(m[k]>prev)
{
c++;
prev=m[k];
k++;
}
maxm=max(maxm,c);
}
}
cout<<maxm;
return 0;
}
但这对于像{2,2,1,2,3,1,2,3,4,3,5}这样的案件给出了错误的答案 任何帮助将不胜感激。
答案 0 :(得分:2)
让我们在这里讨论算法,而不是跳到答案/代码。
将值与每个元素相关联。任何元素X
的值将是我在遇到X-1
之前看到的从1
到X
的元素数量,并将值加1,因为现在我们遇到了{ {1}}也。
因此,由于数组的元素严格在 1&lt; = A [i] <= 10 6 之间,我们很幸运。
我们为每个元素创建一个数组,无论它们是否出现在数组中。这种方法类似于Hash Table
但由于我们所有的元素都是整数,我们使用一个数组作为一个简单的哈希表,其中key是数组的索引,值是X
,即值存储在索引中。
现在让我们对我们的一个样本输入进行干式处理:
5 1 5 6 2 3 8 7 4
初始化哈希表如下所示:
hash_table[index]
现在我们遇到hash_table = {0,0,0,0,0,0,0,0,0}; // Not showing indices > 8 because they won't be affected.
:
我们查找hash_table [4]的值并添加1并将其作为5
的值,即5
所以哈希表现在看起来像这样:
hash_table[5] = hash_table[4] + 1
然后我们遇到hash_table = {0,0,0,0,0,1,0,0,0};
:我们做同样的事情:
1
在接受所有数字之后,hash_table看起来像这样:
hash_table = {0,1,0,0,0,1,0,0,0};
我们的答案是hash_table的最大值,即4。
谈话很便宜,请告诉我代码:
hash_table = {0,1,2,3,4,1,2,3,1}
那么如果你不能投票怎么办?如果您发现它有用,您仍然可以接受这个答案!
答案 1 :(得分:0)
你觉得有点太复杂了。你只需要迭代一次数组并计算序列的长度并记住最长的序列:
int main() {
int size;
int input[100000];
/* ... get your input with size elements ... */
int current = 1;
int biggest = 1;
for (int i=1;i<size;i++) {
if (input[i] == input[i-1] + 1) { current++; }
else {
if (current > biggest) { biggest = current; }
current = 1;
}
}
}