交替序列查找器

时间:2015-10-25 00:41:37

标签: c algorithm data-structures

我应该在数组中找到最长的交替序列。

例如, -1 3 -4 5 -2 1 -7 5 5 最长的序列是: -1 3 -4 5 -2 1 -7 5

int ZigZag(int a[], int N) 
{
int i;
int j;

int z = 0;

int dolzina = 0;

node *result = NULL;

int prethodenZnak = getSign(a[0]);

for(i = 0; i < N; i++)
{
    for(j = i; j < N; j++)
    {
        if(a[j] == 0)
            a[j] = prethodenZnak;

        if(getSign(a[j]) != prethodenZnak)
        {
            dolzina++;
            prethodenZnak = getSign(a[j]);
        }
        else
            break;
    }
    append(&result, dolzina+1);

    dolzina = 0;
}

return max(result);
}

这是我当前的代码,但遇到零(0)时无法提供解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

获取所有子序列的方法非常低效,因为序列中的切片数量为O(N*N)。您可以在O(N)时间内完成此操作,只需迭代数组并保持最长的交替切片到目前为止。每当你发现一个交替的切片结束时,你只是再次开始计数,如果你击败了之前的分数,你用新的分数替换它,依此类推。

假设0与其他所有符号相同,则以下代码包含给定示例[8 -1 0 2 -1 3 -8 2 -3]

int alternates(int current, int previous){
    return (current > 0 && previous < 0) || (current < 0 && previous > 0);
}

int zigzag(int a[], int N){
    int currentLength = 1, longest = 1, longestStart = 0, currentStart = 0;

    for(int i = 1; i<N; ++i){
        currentLength = alternates(a[i], a[i-1])? currentLength+1 : 1;

        if(currentLength == 1)
            currentStart = i;

        if(currentLength > longest){
            longest = currentLength;
            longestStart = currentStart;
        }
    }

    printf("position = %d\n", longestStart);

    return longest;
}

int main(int argc, char **argv){
    int example[] = {8, -1, 0, 2, -1, 3, -8, 2, -3};
    printf("RESULT: %d\n", zigzag(example, 9));
}

请记住,此代码还会打印序列开始的位置,仅用于调试目的。