当前位置 : 首页 » 文章分类 :  算法  »  LeetCode.347.Top K Frequent Elements 前K个高频元素

LeetCode.347.Top K Frequent Elements 前K个高频元素

题目描述

347 Top K Frequent Elements
https://leetcode-cn.com/problems/top-k-frequent-elements/

Given a non-empty array of integers, return the k most frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

Input: nums = [1], k = 1
Output: [1]

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.


相似题目

LeetCode.215.Kth Largest Element in an Array 寻找数组中第K大的数
LeetCode.703.Kth Largest Element in a Stream 数据流中的第K大元素
LeetCode.378.Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

LeetCode.347.Top K Frequent Elements 前K个高频元素
LeetCode.剑指offer.040.数组中最小的k个数
LeetCode.023.Merge k Sorted Lists 合并K个排序链表


解题过程

先用 map 统计数组中各个元素的出现次数
然后建立一个长度为K的最小堆,堆中存储 Pair(出现次数, 元素值) 并指定使用 Pair.getkey 比较
用map的前K个元素初始化,然后从第K+1个元素开始,如果大于堆顶,则删除堆顶并插入元素;如果小于堆顶,则继续读入下一个,这样最后最小堆里剩的就是频率前k大的数.

时间复杂度 O(Nlogk) ,空间复杂度 O(N)

import java.util.Comparator;
import javafx.util.Pair;

private static class SolutionV2020 {
    public List<Integer> topKFrequent(int[] nums, int k) {
        if (null == nums || 0 == nums.length) {
            return null;
        }
        // 统计数组中各个元素的出现次数  数值 -> 次数
        Map<Integer, Integer> map = new HashMap<>();
        for (int n : nums) {
            map.put(n, map.getOrDefault(n, 0) + 1);
        }

        // 最小堆,Pair<出现次数, 数值>
        // PriorityQueue<Pair<Integer, Integer>> priorityQueue = new PriorityQueue<>(k, (p1, p2) -> p1.getKey() - p2.getKey());
        PriorityQueue<Pair<Integer, Integer>> priorityQueue = new PriorityQueue<>(k, Comparator.comparingInt(Pair::getKey));
        map.forEach((key, value) -> {
            if (priorityQueue.size() < k) {
                priorityQueue.offer(new Pair(value, key));
            } else if (value > priorityQueue.peek().getKey()) {
                priorityQueue.poll();
                priorityQueue.offer(new Pair(value, key));
            }
        });
        return priorityQueue.stream().map(Pair::getValue).collect(Collectors.toList());
    }
}

GitHub代码

algorithms/leetcode/leetcode/_347_TopKFrequentElements.java
https://github.com/masikkk/algorithms/blob/master/leetcode/leetcode/_347_TopKFrequentElements.java


上一篇 LeetCode.414.Third Maximum Number 数组中第三大的数

下一篇 LeetCode.718.Maximum Length of Repeated Subarray 最长公共子串/最长重复子数组

阅读
评论
486
阅读预计2分钟
创建日期 2020-02-24
修改日期 2020-02-24
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论