Форум сайта python.su
Здраствуйте!
Помогите придумать как лучше сделать такую задачку:
Есть список из чисел от 1 до N. Числа расположены в случайном порядке. Необходимо, проверить что в списке есть все числа от 1 до N при этом каждое число встречается только один раз.
Спасибо
Офлайн
if len(lst) == N == len( set(lst) ):
print( "Да" )
Офлайн
def f(num,lst): return reduce(lambda x,y:x+y,map(lambda x: num==x,lst))
def g(numlst,lst):
for num in numlst:
if f(num,lst) != 1:
return False
return True
In [44]: l
Out[44]: [1, 3, 9, 0, 5, 1, 8, 3, 4, 10, 100500, 100500]
In [45]: set(l)
Out[45]: set([0, 1, 3, 4, 5, 8, 9, 10, 100500])
In [46]: g([1,2,3],l)
Out[46]: False
In [47]: g([1,2,3],set(l))
Out[47]: False
In [48]: g([0,1,3],l)
Out[48]: False
In [49]: g([0,1,3],set(l))
Out[49]: True
Офлайн
Довольно порочный метод, со сложностью аж N^3
Тут не надо умничать, надо пройтись старым добрым циклом, увеличивая значение переменной счетчика внутри цикла… вот и все. И будет квадратичная сложность :)
Офлайн
Спасибо всем!
Заюзал вариант Isem'a
Офлайн
Вообще задача вроде линейной сложности.
a=numpy.zeros(N)
a[arr]=1
if min(a)==0:
print "не хватает"
Отредактировано (Фев. 4, 2011 20:42:55)
Офлайн
да, я напутал не квадратичная а 2*N
Офлайн
Тогда со сложностью O(N), а именно N:
if 6*sum( i*i for i in lst ) == N*(N+1)*(2*N+1):
print( "Да, это так" )
Отредактировано (Фев. 4, 2011 23:07:57)
Офлайн
Спасибо за интересное решение. Но ему не хватает конструктивного указания как выбирать степень при разном N.
“Поиск метода доказать что это не так” - очень лестное предложение, было-бы интересно заняться, но наверное требуется побольше времени. :) Интересующиеся могут посмотреть что такое десятая проблема Гильберта. http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D0%93%D0%B8%D0%BB%D1%8C%D0%B1%D0%B5%D1%80%D1%82%D0%B0
Если у вас Isem есть предложения - не скромничайте - озвучте.
Отредактировано (Фев. 5, 2011 10:56:16)
Офлайн
9^2 + (9 - 1)^2 == 12^2 + 1 True
10^3 + (10 - 1)^3 == 12^3 + 1 True
поэтому предлагаемый вами алгоритм некорректен.
Офлайн