1 题目
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java
2.1 方法一(桶排序)
与桶排序不太一样,桶排序是根据元素值排序,方法是以元素值为索引,将元素数量存入桶数组(即桶标号 = 元素值,桶内值 = 元素数量)。一个桶仅有一个桶标号和一个桶内值,桶 = 存整形的数组。
本题是根据元素数量排序,方法是以元素数量为索引,将元素值存入桶数组中(即桶标号 = 元素数量,桶内值 = 元素值)。这就导致某些桶内存在多个值,桶 = 存集合的数组。
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
// 先将元素对应的数量存入Map中
HashMap<Integer, Integer> elementNum = new HashMap<Integer, Integer>();
for(int element: nums){
elementNum.put(element, elementNum.getOrDefault(element, 0) + 1);
}
// 以元素数量为索引,将元素存入桶数组
List<Integer>[] bucket = new List[nums.length+1];
for(int element: elementNum.keySet()){
int num = elementNum.get(element);
if(bucket[num] == null){
bucket[num] = new ArrayList<>();
}
bucket[num].add(element);
}
// 倒序遍历桶数组
List<Integer> ans = new ArrayList<Integer>();
for(int i = bucket.length - 1; i > 0 && ans.size() < k; i--){
if(bucket[i] != null) ans.addAll(bucket[i]);
}
return ans;
}
}
注:
(1)map.getOrDefault(key, default); 代表如果存在key,返回value,如果不存在key,返回default
(2)第二部分的集合数组可以有多重类型,且注意集合数组创建格式
List<Integer>[] bucket = new List[nums.length+1];
ArrayList<Integer>[] bucket = new ArrayList[nums.length+1]; //可以替换
LinkedList<Integer>[] bucket = new LinkedList[nums.length+1]; //不能替换,除非将buket中new成LinkedList
(3)ans.addAll(bucket[i]); 是将bucket[i]中存储的所有元素(是个集合)全部加入ans集合中
来源:CSDN
作者:闲人泽阳
链接:https://blog.csdn.net/weixin_43969686/article/details/104337357