Всем привет!
Дан массив чисел, в нем необходимо найти длину самой длинной последовательности(последовательность может быть только с разнице на 1) за O(n)
Собственно вот пример:
1 2 433 500 3 900 4
Следовательно длинная самая последовательность 4(1 2 3 4)
И вот как это все реализовать за 1 проход
Может какие-то наводки/ссылки/статьи
Сергей Соколов,
зачем искать то?
явно же автор опечатался в описании
потому что последовательность по определению состоит из последовательно расположенных элементов.
Алексей Майрин,
тогда это не будет последовательностью
но если вам так хочется нужно всего лишь запоминать какое число из "последовательности" уже попадалось и искать число большее на единицу
//arr[0..n] массив в котором будет производится поиск
//current_length длина текущей последовательности
//max_start,max_length начало и длина наибольшей последовательности
current_start:=0;
current_length:=1;
max_start:=0;
max_length:=0;
for i:=1 to n do//начиная со второго элемента
if arr[i]=arr[i-1]+1 then
begin//если элемент больше предыдущего на 1
current_length:=current_length+1;
end
else
begin
if current_length>max_length then
begin
max_length:=current_length;
max_start:=i-1-current_length;//пишется с головы поэтому смещение может быть не верным
current_length:=1;
end;
end;
//на случай если конец самой длинной последовательности совпадает с концом массива
if current_length>max_length then
begin
max_length:=current_length;
max_start:=n-current_length;//пишется с головы поэтому смещение может быть не верным
end;
https://www.youtube.com/watch?v=t2DpD9GnhfU гуровиц объясняет более внятно.
Просто берете стандартный алгоритм, при n-ом итеме проверяете его разницу в значениях и если разница равно 1 то только тогда увеличиваете счетчик.
Алексей Майрин, все алгоритмы за n2. Этот алгоритм можно ускорить максимум до NLogN, но не быстрее, но тогда в этом случае посик самой последовательнсоти будет очень сложен
Хранить hash map, в которой ключ - значение последнего элемента в последовательности встреченной раньше, а значение -- длина. И дальше проходим по массиву и заполняем.
Длинна текущей последовательности. В этом hash map каждый ключ это отдельная последовательность а значение это ее длинна. Если брать ваш пример то как тот будет:
Шаг 1
Ключ = 1 значение = 1
Шаг 2
Ключ = 2 значение = 2 потому что мы продолжаем последовательность начатую на шаге 1
Шаг 3
Уже имеем две последовательности
Ключ = 2 значение 2
Ключ = 433 значение = 1
Шаг 4
Ключ = 2 значение = 2
Ключ = 433 значение = 1
Ключ = 500 значение = 1
Шаг 5
Ключ = 3 значение = 3
Ключ = 433 значение = 1
Ключ = 500 значение = 1
Шаг 6
Ключ = 3 значение = 3
Ключ = 433 значение = 1
Ключ = 500 значение = 1
Ключ = 900 значение = 1
Шаг 7
Ключ = 4 значение = 4
Ключ = 433 значение = 1
Ключ = 500 значение = 1
Ключ = 900 значение = 1
Т.е. на каждом шаге мы берём один элемент из массива и либо удлиняем имеющуюся цепочку, либо начинаем новую.