2010-02-22 5 views

Répondre

3

De Wikipedia: Longest increasing subsequence (O (n log n))

L = 0 
for i = 1, 2, ... n: 
    binary search for the largest positive j ≤ L such that X[M[j]] < X[i] (or set j = 0 if no such value exists) 
    P[i] = M[j] 
    if j == L or X[i] < X[M[j+1]]: 
     M[j+1] = i 
     L = max(L, j+1) 
0

Je ne sais pas ce que vous entendez par l'algorithme, mais voici une idée.

Si le tableau est trié par défaut (c'est-à-dire lorsque la création d'une valeur de tableau est terminée à la fin du fait qu'il s'agit d'une séquence croissante), récupérez la dernière valeur du tableau.

Si ce n'est pas le cas, créez une nouvelle variable et faites une boucle dans le tableau en affectant la valeur courante à la boucle si elle est plus grande que celle stockée dans la variable temporaire.

+0

En ce qui concerne la réponse ci-dessus, en faisant L = 0 ne fonctionnerait pas si le tableau se compose uniquement d'entiers négatifs (comme 0 est> -1). Par conséquent, vous pouvez définir L sur la première valeur du tableau s'il existe. –

+0

il est non trié. ainsi par exemple si vous avez 0 2 4 5 3 6 1 9 8 vous obtiendrez 0 2 4 5 – SuperString

1

Comme le suggère Mehrdad, LIS est au moins proche de ce dont vous avez besoin. Ceci est implémenté le plus efficacement en utilisant programmation dynamique/memoization. Si vous êtes intéressé par des choses comme ça, je vous recommande de la tête sur TopCoder

Questions connexes