1 つのアイデア: まあ、とにかくリストをソートする必要があると思いますが、マージやクイックソートはできません。しかし、メモリがあれば、整数の並べ替えをカウントすることからアイデアを使用できます。
したがって、0 から最大の int 値までの 0 と 1 の配列を作成し、値がある場合はそれを 1 で埋めてから、最大連続配列を見つけることができます。
2 アイデア: 値の辞書を作成し、最小値と最大値を見つけます - すべての O(N) 操作:
dict = {1: 1, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 10: 10}
min = 1
max = 10
次に、同様に行っi in range(min, max)
て、最長の連続サブセットを見つけます
>>> 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)
しかし、これは次のような疎なリストでは遅くなる可能性があります[1, 9000, 100000]
EDIT : Grigor Gevorgyanの非常に優れた回答に基づいて、Python での O(N) 辞書ソリューションのコードを次に示します (シンプルさが大好きです!!!)
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]
出力:
{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