【排序算法】LeetCode-347. 前 K 个高频元素

347. 前 K 个高频元素。

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

复制代码
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

复制代码
输入: nums = [1], k = 1
输出: [1]

提示:

复制代码
1 <= nums.length <= 10^5
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

算法分析

解题思路

  • 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率

  • 维护一个元素数目为 kkk 的最小堆

  • 每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较

  • 如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
    最终,堆中的 kkk 个元素即为前 kkk 个高频元素

    class Solution {
    public int[] topKFrequent(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int num : nums) {
    map.put(num, map.getOrDefault(num, 0) + 1);
    }
    PriorityQueue<Integer> pq = new PriorityQueue<>((e1, e2) -> map.get(e1) - map.get(e2));

    复制代码
          for (Integer key: map.keySet()) {
              if (pq.size() < k) {
                  pq.add(key);
              } else if (map.get(key) > map.get(pq.peek())) {
                  pq.remove();
                  pq.add(key);
              }
          }
    
          int[] res = new int[k];
          int index = 0;
          while(!pq.isEmpty()) {
              res[index++] = pq.remove();
          }
          return res;
      }

    }

复杂性分析

时间复杂度:O(nlogk)

空间复杂度:O(n)

相关推荐
松涛和鸣25 分钟前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
Jay Kay34 分钟前
GVPO:Group Variance Policy Optimization
人工智能·算法·机器学习
Epiphany.5561 小时前
蓝桥杯备赛题目-----爆破
算法·职场和发展·蓝桥杯
简单中的复杂1 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
YuTaoShao1 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法三)DP 空间优化
算法·leetcode·职场和发展
茉莉玫瑰花茶1 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
wVelpro1 小时前
如何在Pycharm 2025.3 版本实现虚拟环境“Make available to all projects”
linux·ide·pycharm
cpp_25011 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_25012 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
uesowys2 小时前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法