Задачи
April 1, 2024
Наименьшее количество различных целых чисел после K удалений
Дан массив целых чисел arr и целое число k.
Необходимо найти наименьшее количество различных целых чисел после удаления ровно k элементов.
1. arr = [5,5,4], k = 1
Output: 1
2. arr = [4,3,1,1,3,3,2], k = 3
Output: 2
Пояснение: удаляем 4, 2 и например 1, тогда останутся 3, 1, 3, 3, т.е. останутся 2 уникальных целых числа 1 и 3.
Разбор
Формулировка задачи не совсем понятна, на что справедливо указали в комментариях к этой задачи. Тут необходимо так удалить K элементов массива, что на выходе получится наименьшее количество "уникальных" различных целых чисел.
Для наглядности можно еще раз разобрать 2й пример задачи. Тогда решение будет довольно очевидным.
Алгоритм
- Ключом к решению будет словарик, где ключом будет элемент массива, а значением - количество его вхождений в массив.
- 2м шагом будет сортировка словарика по значению таким образом, что элементы с наименьшим количеством вхождений в массив будут вначале.
- Далее мы проходим по полученному списку количества вхождений элементов и вычитаем исходное число K. Считаем количество итераций, которые нам понадобятся.
- Тогда ответом будет разность размера списка и этого счетчика, т.е. количество уникальных / различных целых чисел после удаления K элементов.
Реализация
public static int FindMinNumOfUniqueIntegers(int[] arr, int k) {
var map = new Dictionary<int, int>();
for (int i = 0; i < arr.Length; i++)
{
if (!map.ContainsKey(arr[i]))
{
map[arr[i]] = 0;
}
map[arr[i]] += 1;
}
int count = 0;
var sortedFreq = map.OrderBy(x => x.Value).Select(x => x.Value);
foreach (int freq in sortedFreq)
{
if (freq > k)
{
break;
}
k -= freq;
count++;
}
return sortedFreq.Count() - count;
}https://gist.github.com/unilecs/44954a4bb4fc6c75711a2de690d1b240