Сама идея состоит в том, чтоб брать подмассивы включающие уникальные числа из основного массива, постепенно набирая все возможные варианты. Потом фильтруем в поиске наименьшего. Возвращаем его длину.
Алгоритм простой. Допустим число уникальных цифр 4, тогда берем с первого по 4е число и смотрим, если есть все уникальные, если да, то переходим к следующему этапу, если нет, то берем с первого по 5й элементы, проверяем и тд. Далее повторяем процедуру заново, но уже берем от второго элемента.
function minUniqueSubarrayLength(arr) {
const uniqueCount = new Set(arr).size;
const subArrays = [];
for (let sliceStart = 0; sliceStart < arr.length - uniqueCount; sliceStart++) {
for (let sliceEnd = sliceStart + uniqueCount; sliceEnd < arr.length; sliceEnd++) {
const subArray = arr.slice(sliceStart, sliceEnd);
const set = new Set(subArray);
if (set.size === uniqueCount) {
subArrays.push(subArray);
break;
}
}
}
return subArrays.reduce((minSize, subArray) => {
if (subArray.length < minSize) {
return subArray.length;
}
return minSize;
}, arr.length);
}
minUniqueSubarrayLength([1,1,2,3,3,4,1,1,1,1,2,3,4,1,1,1,1,1,4,3,3,3,2,1,1]); // 4
minUniqueSubarrayLength([1,1,1,2,3,3,4,1,1,1,1,1,1,4,3,3,3,2,1,1,1,2]); // 5
minUniqueSubarrayLength([1,2,2,2,3,4,2,2,2]); // 6
minUniqueSubarrayLength([1,1,1,3,2,1,3,2,2,2,1]); // 3