首页 > 其他分享 >12_前K个高频元素

12_前K个高频元素

时间:2023-10-18 11:15:39浏览次数:34  
标签:12 nums int 元素 pq 数组 高频 o2

前K个高频元素

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

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

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

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

【思路】

本题主要涉及三部分内容:

  1. 要统计元素出现的频率
  2. 对频率进行排序
  3. 找出前K个高频元素

统计元素出现的频率,可以通过Map来实现;然后是对出现的频率进行排序,这里使用优先级队列。

/*Comparator接口说明:
 * 返回负数,形参中第一个参数排在前面;返回正数,形参中第二个参数排在前面
 * 对于队列:排在前面意味着往队头靠
 * 对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆),
 *                                从队头到队尾按从大到小排就是最大堆(大顶堆)--->队头元素相当于堆的根节点
 * */
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        // 优先级队列
        // lambda表达式设置优先级队列从大到小存储o1-o2为从大到小,o2-o1反之
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
        int[] res = new int[k];  // 答案数组为k个元素
        Map<Integer, Integer> map = new HashMap<>();  //记录元素出现次数
        for (int num: nums)  map.put(num, map.getOrDefault(num, 0) + 1);
        for (var x : map.entrySet()) {  // entrySet获取k-v Set集合
            // 将kv转化为数组
            int[] tmp = new int[2];
            tmp[0] = x.getKey();
            tmp[1] = x.getValue();
            pq.offer(tmp);
            if (pq.size() > k) {
                pq.poll();
            }
        }
        for (int i = 0; i < k; i++) {
            res[i] = pq.poll()[0];  // 获取优先队列里的元素
        }
        return res;
    } 
}

标签:12,nums,int,元素,pq,数组,高频,o2
From: https://www.cnblogs.com/codingbao/p/17771599.html

相关文章

  • 低水平特征(low-level)高水平特征(high-level),傅里叶光谱高频低频
    图像的频率:灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。(1)什么是低频?低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频.对于一幅图像来说,也就是边缘以内的内容为低频,而边缘内的内容就是图像的大部分信息,即图像的大致概貌和......
  • 【根号分治】P9212 「蓬莱人形」 题解
    P9212看到除法相关容易想到根号分治。先对\(x,y\)进行讨论,不妨令\(0\lex,y<m\)。\(x<y\)时,当满足\(a_i+y<m\)或\(a_i+x\gem\)时,即当\(a_i<m-y\)或\(a_i\gem-x\)满足\((a_i+x)\bmodm<(a_i+y)\bmodm\),即\(a_i\bmodm\in[0,m-y-1]\bigcup[m-x,m......
  • Debian衍生桌面项目SpiralLinux12.231001发布
    SpiralLinux 是一个从Debian衍生出来的桌面项目,其重点是在所有主要桌面环境中实现简洁性和开箱即用的可用性。spiralLinux是为刚接触Linux世界的人们量身定制的发行版。这是GeckoLinux开发人员的创意,他更喜欢保持匿名。尽管他不愿透露姓名,但他的操作系统值得称赞,......
  • List<Integer> list 删除指定元素
    Listlist删除指定元素List<Integer>list1=newArrayList<>();list1.add(1);list1.add(2);list1.add(4);list1.add(3);list1.remove((Integer)4);System.out.println(list1);......
  • python12
    1.列表(list)列表是一个有序且可变的容器,在里面可存放多个类型的元素。1.1定义use_list=["天","地","人"]number_list=[98,66,55]data_list=[1,True,"Alex"]use_list=[]use_list.append("铁锤")use_list.append(123)use_list.append(True)p......
  • 20231012
    //compromise,further,slash,closethedeal,halfmeasure,mutualbenefit,principleofmediocrity,profitmargin,reachsomemiddleground,rightinthemiddle,splitthedifference,strikeabalance,take...intoconsideration,that'sadealcompr......
  • SQL Server2012 安装及问题处理
    安装方式:参考 SQLServe详细安装步骤_sqlserver安装教程_Dandi0707的博客-CSDN博客遇到的问题:等了半天一直卡在下图的界面 然后我决定手动开启NetFx3首先使用cmd命令输入control,回车然后点击程序 点击启动或关闭Windows功能 选中.NETFramework3.5再点击确定......
  • 【发现一个问题】macos m2 下无法使用 x86_64-linux-musl-gcc 链接含有 avx512 指令
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯一开始是使用golang中的cgo来编译:envCC=cCGO_ENABLED=1GOOS=linuxGOARCH=amd64\CGO_CFLAGS="-mavx-mavx2-mavx512f-mavx512vl-mavx512bw-O2"\gobu......
  • 全志R128驱动OLED屏幕步骤教程
    驱动OLED屏本文案例代码下载地址OLED驱动案例代码https://www.aw-ol.com/downloads?cat=24OLED,即有机发光二极管(OrganicLightEmittingDiode)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广......
  • ORA-12899: value too large for column
    Errorsinfile/lbc/lionrdb/app/product/diag/rdbms/cnlionrdb/lionrdb02/trace/lionrdb02_j000_242326.trc:ORA-12012:erroronautoexecuteofjob3964ORA-12008:errorinmaterializedviewrefreshpathORA-12899:valuetoolargeforcolumn"FLUSR"......