Я думаю, что следующее решение будет работать за время O (n) с использованием пространства O (n).
Начните с помещения всех записей в массиве в хеш-таблицу.Затем создайте вторую хеш-таблицу, в которой хранятся элементы, которые мы «посетили» и которые изначально были пустыми.
Теперь итерируйте по массиву элементов по одному за раз.Для каждого элемента проверьте, находится ли элемент в посещаемом наборе.Если так, пропустите это.В противном случае, посчитайте от этого элемента вверх.На каждом шаге проверяйте, находится ли текущий номер в основной хеш-таблице.Если это так, продолжайте и отметьте текущее значение как часть посещенного набора.Если нет, остановись.Далее повторите эту процедуру, кроме как считать вниз.Это говорит нам о количестве смежных элементов в диапазоне, содержащем это конкретное значение массива.Если мы будем отслеживать самый большой диапазон, найденный таким образом, у нас будет решение нашей проблемы.
Сложность этого алгоритма во время выполнения - O (n).Чтобы увидеть это, обратите внимание, что мы можем построить хеш-таблицу на первом шаге за O (n) времени.Затем, когда мы начинаем сканирование в массив, чтобы найти самый большой диапазон, каждый сканированный диапазон занимает время, пропорциональное длине этого диапазона.Поскольку общая сумма длин диапазонов - это количество элементов в исходном массиве, и поскольку мы никогда не сканируем один и тот же диапазон дважды (потому что мы помечаем каждое посещаемое число), этот второй шаг занимает время O (n) какну, для чистого времени выполнения O (n).
РЕДАКТИРОВАТЬ: Если вам интересно, у меня есть реализация Java изэтот алгоритм вместе с гораздо более подробным анализом того, почему он работает и почему он имеет правильное время выполнения.Также рассматриваются некоторые крайние случаи, которые не очевидны в начальном описании алгоритма (например, как обрабатывать целочисленное переполнение).
Надеюсь, это поможет!