Задачи
April 1
Наименьшее количество различных целых чисел после 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