Решение данной задачи можно осуществить с помощью двух указателей – левого и правого.
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. Это связано с тем, что каждый элемент массива рассматривается не более двух раз: первый раз при увеличении правой границы и второй раз при увеличении левой границы. В худшем случае мы обрабатываем каждый элемент только один раз, поэтому алгоритм работает за линейное время.