1 idée: bien, je pense qu'il faut un peu trier la liste de toute façon, mais vous ne pouvez pas aller avec la fusion ou du tri rapide. Mais si vous avez de la mémoire, vous pouvez utiliser l'idée de comptage, de tri pour les entiers.
Ainsi, vous pouvez créer une matrice de 0 et de 1, de 0 à max int valeur, puis le remplir avec de si vous en avez de la valeur et puis trouver continue maximale de tableau
2 idée: créer le dictionnaire de valeurs, de trouver des min et max - O(N) opérations:
dict = {1: 1, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 10: 10}
min = 1
max = 10
ensuite, comme i in range(min, max)
et de et de trouver le plus long en continu sous-ensemble
>>> d = [1, 3, 5, 7, 4, 6, 10]
>>> s = set(d)
>>> mind = min(d)
>>> maxd = max(d)
>>> a, b, j = 0, 0, 0
>>> for i in range(mind, maxd):
if i not in s:
if (b - a) < (i - j - 1):
a, b = j, i - 1
j = i + 1
>>> a, b
(3, 7)
mais cela pourrait être lent pour clairsemée des listes de ce genre [1, 9000, 100000]
EDIT: sur la base super grande réponse de Grigor Guevorguyan, voici le code pour O(N), dictionnaire de la solution en Python (j'adore la simplicité!!!)
l = [1, 3, 5, 7, 4, 6, 10]
d = {x:None for x in l}
print d
for (k, v) in d.iteritems():
if v is not None: continue
a, b = d.get(k - 1), d.get(k + 1)
if a is not None and b is not None: d[k], d[a], d[b] = k, b, a
elif a is not None: d[a], d[k] = k, a
elif b is not None: d[b], d[k] = k, b
else: d[k] = k
print d
m = max(d, key=lambda x: d[x] - x)
print m, d[m]
sortie:
{1: None, 3: None, 4: None, 5: None, 6: None, 7: None, 10: None}
{1: 1, 3: None, 4: None, 5: None, 6: None, 7: None, 10: None}
{1: 1, 3: 3, 4: None, 5: None, 6: None, 7: None, 10: None}
{1: 1, 3: 4, 4: 3, 5: None, 6: None, 7: None, 10: None}
{1: 1, 3: 5, 4: 3, 5: 3, 6: None, 7: None, 10: None}
{1: 1, 3: 6, 4: 3, 5: 3, 6: 3, 7: None, 10: None}
{1: 1, 3: 7, 4: 3, 5: 3, 6: 3, 7: 3, 10: None}
{1: 1, 3: 7, 4: 3, 5: 3, 6: 3, 7: 3, 10: 10}
3 7