不同整数的最少数目
难度:
标签:
题目描述
代码结果
运行时间: 317 ms, 内存: 0.0 MB
import java.util.*;
import java.util.stream.Collectors;
/**
* 题目思路:
* 1. 使用流统计数组中每个整数出现的频率。
* 2. 将频率按升序排序。
* 3. 逐个移除频率最低的整数,直到k为0。
* 4. 计算剩余不同整数的数量。
*/
public class Solution {
public int findLeastNumOfUniqueInts(int[] arr, int k) {
Map<Integer, Long> frequencyMap = Arrays.stream(arr).boxed().collect(Collectors.groupingBy(e -> e, Collectors.counting()));
List<Long> frequencies = new ArrayList<>(frequencyMap.values());
Collections.sort(frequencies);
int uniqueCount = frequencies.size();
for (long freq : frequencies) {
if (k >= freq) {
k -= freq;
uniqueCount--;
} else {
break;
}
}
return uniqueCount;
}
}
解释
方法:
本题解的思路是首先使用一个哈希表(通过Counter实现)来统计数组中每个元素的频率。然后,将频率转换成列表并进行排序,以便从最少出现的元素开始移除,以尽可能减少数组中不同整数的个数。遍历排序后的频率列表,如果某个频率小于或等于剩余可移除的元素数k,就将该频率对应的元素完全移除,并相应地减少k的值和不同整数的计数。如果k为0或遍历完列表,则返回当前的不同整数个数。
时间复杂度:
O(n + u log u)
空间复杂度:
O(u)
代码细节讲解
🦆
在决定使用哈希表来统计元素频率时,你考虑了哪些因素使得哈希表成为此问题的合适选择?
▷🦆
为什么在处理完所有可以完全移除的元素后,算法就直接返回剩余的不同整数数量,而不考虑剩余的k值是否还可以进一步减少整数数量?
▷🦆
在排序频率列表后,算法是如何确保即使移除了多个低频元素也能达到最少的不同整数数目的?
▷🦆
如果k的值非常大,接近或等于数组长度,此算法有没有特殊的处理或优化方法?
▷