在O(n)时间内找到序列的最长连续子序列的长度,其中所有元素都小于10 ^ 6

时间:2016-10-15 08:20:16

标签: c++ algorithm

我必须找到一个数组最大增加子序列的长度,这样子序列的任何两个连续元素之间的差异是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}这样的案件给出了错误的答案 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

让我们在这里讨论算法,而不是跳到答案/代码。

将值与每个元素相关联。任何元素X的值将是我在遇到X-1之前看到的从1X的元素数量,并将值加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; 
        }   
    }
}