Top.Mail.Ru

Решение данной задачи можно осуществить с помощью двух указателей – левого и правого.

1. Инициализируем переменные left и right значениями 0.
2. Создаем пустой словарь freq для подсчета частоты каждого элемента на текущем подотрезке.
3. Создаем переменную unique для подсчета количества уникальных элементов на текущем подотрезке и инициализируем её значением 0.
4. Создаем переменные min_left и min_right для хранения левой и правой границы минимального подотрезка. Инициализируем их значениями None.
5. Пока правая граница находится в пределах массива (right < n): - Добавляем a[right] в словарь freq и увеличиваем его частоту на 1. - Если freq[a[right]] равно 1, увеличиваем unique на 1, так как встретили новый уникальный элемент. - Если unique равно k, значит на текущем подотрезке есть ровно k различных значений. - Если минимальный подотрезок не определен (min_left и min_right равны None), присваиваем им значения left и right. - Если текущий подотрезок меньше минимального подотрезка, обновляем min_left и min_right. - Уменьшаем unique, удалая самый левый элемент на текущем подотрезке из словаря freq и уменьшая его частоту на 1. Увеличиваем left на 1. - Увеличиваем right на 1. 6. Выводим значения min_left и min_right. Алгоритм работает за O(n) времени, где n - длина массива a. Это связано с тем, что каждый элемент массива рассматривается не более двух раз: первый раз при увеличении правой границы и второй раз при увеличении левой границы. В худшем случае мы обрабатываем каждый элемент только один раз, поэтому алгоритм работает за линейное время.

   
[metform form_id="1136"]