内容关键:
- 时间复杂度为 O(n) 的桶排序
- java中各类hash实现的遍历顺序
题中要求的时间复杂度不能超过 O(nlogn)
首先如果在O(nlogn)的时间复杂度能怎么做呢?
hash + 快排
但是如果要在 O(n) ,并且题中没有要求空间复杂度,那么我们就可以使用 桶排序
桶排序的特点
- 稳定的
- 最快
- 大量空间
算法的大量思路还是很简单的,先hash获取所有element出现的频率,然后遍历hash表,再存入对饮的桶中
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer>[] bucket = new List[nums.length + 1];
Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();
for (int n : nums) {
frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
}
for (int key : frequencyMap.keySet()) {
int frequency = frequencyMap.get(key);
if (bucket[frequency] == null) {
bucket[frequency] = new ArrayList<>();
}
bucket[frequency].add(key);
}
List<Integer> res = new ArrayList<>();
for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; pos--) {
if (bucket[pos] != null) {
res.addAll(bucket[pos]);
}
}
return res;
}
代码很好理解,并且容易通过,但是一个额外的问题却跑了出来,java中的hashmap 的 keyset 返回的值是有序的吗?其他hash的实现呢?
不过,关于hashmap的部分是错误的,网上很多都说 hashmap 的 setkey 是 无序的,不过经过我亲自测试,最新的java中,应该是 升序的。
Hashtable ———————降序
TreeMap / HashMap ——升序
LinkedHashMap ———- 原序
有时候,与其各种找结果不如自己跑一下