[抄题]:
Given a non-empty array of integers, return the k most frequent elements.
For example,
Given [1,1,1,2,2,3]
and k = 2, return [1,2]
.
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
List<Integer>[] bucket列表组的空间是n+1,因为可能出现最小0次、最大n次的情况。
[思维问题]:
想不到木桶排序:统计出现次数相同的情况,所以可以用。空间是n+1,因为可能出现最小0次
[英文数据结构或算法,为什么不用别的数据结构或算法]:
bucket.length - 1 index其实就是出现的次数
Map.getOrDefault(n, 0) 有就是前一个,没有就是后一个
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- if (bucket[i] != null)链表非空才能加,否则NPE
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
想不到木桶排序:统计出现次数相同的情况,所以可以用。
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[算法思想:迭代/递归/分治/贪心]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
[是否头一次写此类driver funcion的代码] :
[潜台词] :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public List<Integer> topKFrequent(int[] nums, int k) { //initialization: result, HashMap, List<Integer> [] Bucket List<Integer> result = new ArrayList<Integer>(); HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); List<Integer> [] bucket = new List[nums.length + 1]; //corner case if (nums == null || nums.length == 0 || k <= 0) return result; //count the frequence into map for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { int n = map.get(nums[i]); map.put(nums[i], n + 1); }else { map.put(nums[i], 1); } } //put all the map's key into Bucket for (int key : map.keySet()) { if (bucket[map.get(key)] == null) bucket[map.get(key)] = new ArrayList(); bucket[map.get(key)].add(key); } //get answer from Bucket for (int i = bucket.length - 1; i >= 0 && result.size() < k; i--) { if (bucket[i] != null) result.addAll(bucket[i]); } //return return result; } }