2, 1, 1 ]) == 2
def find_uniq(arr):
uniq = arr[0]
for element in arr[1:]:
if element != uniq: return uniq
uniq = element
Тут O(2N)
Можно ли вообще за один пробег?
функция не сработает на списке [2,1,1]
На пустом не сработает, но это и предполагается.
ну запусти расскажи какой ответ вернуло
Тут один пробег
Там Slice
Вместо слайса просто начни итерацию с первого элемента Что-то вроде for i in range (1, len(array)): elem = array[i]
range тоже O(N) Разницы нет.
Есть решение за константу
Ого, и как оно выглядит?
Про константное решение я погорячился Но range не O(N) Он же не создаёт коллекцию Можно range через тот же while переделать
Я скорее про range конкретно в этой задаче. Если его сюда добавить то мы все равно итерируемся по списку, но не через in а по индексу. Временная сложность что с ним что без него не меняется. Ушел думать дальше)
Вопрос был изначально можно ли за один пробег - да, можно
Кстати, 2N, N глубоко пофигу это O(N)
Это понятно, но как факт - количество пробегов по строке
А где их кстати 2 что то не заметил...
Он слайсил массив При слайсинге создаётся новый
Кстати если уж на то пошло [1,2,1] можно прогнать и посмотреть...)
если числа - можно за один проход и константную память. Если проивозмльный тип - за O(n) памяти
А почему для произвольного типа линейная память?🤔
потому что set
Так можно и без сэта Решение никак не меняется Будь у тебя те же стр'ы
без сета за один проход со строками?
Ну если мы не знаем Макс длину строки, то по памяти будет не O(N), пушто N кол-во элементов
Обсуждают сегодня