347. 前 K 个高频元素(Java)

若如初见. 提交于 2020-02-16 16:59:23

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集合中

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!