[LeetCode] Top K Frequent Elements 前K个高频元素

[LeetCode] Top K Frequent Elements 前K个高频元素

大家好,又见面了,我是全栈君。

Given a non-empty array of integers, return the k most frequent elements.
For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].
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.

这道题给了我们一个数组,让我们统计前k个高频的数字,那么对于这类的统计数字的问题,首先应该考虑用哈希表来做,建立数字和其出现次数的映射,然后再按照出现次数进行排序。我们可以用堆排序来做,使用一个最大堆来按照映射次数从大到小排列,在C++中使用priority_queue来实现,默认是最大堆,参见代码如下:

解法一:

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> m;
        priority_queue<pair<int, int>> q;
        vector<int> res;
        for (auto a : nums) ++m[a];
        for (auto it : m) q.push({it.second, it.first});
        for (int i = 0; i < k; ++i) {
            res.push_back(q.top().second); q.pop();
        }
        return res;
    }
};

我们还可以使用桶排序,在建立好数字和其出现次数的映射后,我们按照其出现次数将数字放到对应的位置中去,这样我们从桶的后面向前面遍历,最先得到的就是出现次数最多的数字,我们找到k个后返回即可,参见代码如下:

解法二:

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> m;
        vector<vector<int>> bucket(nums.size() + 1);
        vector<int> res;
        for (auto a : nums) ++m[a];
        for (auto it : m) {
            bucket[it.second].push_back(it.first);
        }
        for (int i = nums.size(); i >= 0; --i) {
            for (int j = 0; j < bucket[i].size(); ++j) {
                res.push_back(bucket[i][j]);
                if (res.size() == k) return res;
            }
        }
        return res;
    }
};

本文转自博客园Grandyang的博客,原文链接:前K个高频元素[LeetCode] Top K Frequent Elements ,如需转载请自行联系原博主。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107827.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月12日 下午4:35
下一篇 2022年3月12日 下午4:35


相关推荐

  • WSL2 + Docker + xfce4安装及使用

    WSL2 + Docker + xfce4安装及使用WSL2 Docker 安装及使用 WSL 官方指南 适用于 Linux 的 Windows 子系统安装指南 Windows10 文档比较详细 欢迎大家指错一 前言 1 1 什么是 WSL wsl 是适用于 Linux 的 Windows 子系统 英语 WindowsSubsy 简称 WSL 是一个为在 Windows10 和 WindowsServe 上能够原生运行 Linux 二进制可执行文件 ELF 格式 的兼容层 可让开发人员按原样运行 GNU Linux

    2026年3月18日
    2
  • java map转string_php转java还是转go

    java map转string_php转java还是转goprivateJSONObjecttoJsonObj(Map<String,Object>map,JSONObjectresultJson){Iteratorit=map.keySet().iterator();while(it.hasNext()){Stringkey=(String)it.next();…

    2022年10月5日
    7
  • IDEA 断点调试 debug

    IDEA 断点调试 debug1 行断点在要打断点的那一行左侧 鼠标左键点击 debug 模式运行程序 就会跳到那一行 点 resumeProgra 跳过可以这个断点 跳到下一个打断点的地方 2 详细断点 源断点 按住 shift 然后点鼠标左键 出现这个面板 点击 Done debug 模式运行 然后控制台会有输出表明断点是哪一行被触发的 触发断点具体的类和方法 Suspend 用于多线程调试 ALL 运行到这个地方就会停止 Thred 运行到当前线程就会停止 Condition 是判断条件 当触发了某个条件才会停止 3 方法断点

    2026年3月26日
    2
  • IDEA优化内存配置,可提高启动和运行速度(亲测有效)「建议收藏」

    IDEA优化内存配置,可提高启动和运行速度(亲测有效)「建议收藏」一、优化IDEA配置IDEA默认启动配置主要考虑低配置用户,参数不高(默认最低128m,最高512m),导致启动慢,然后运行也不流畅,这里我们需要优化下启动和运行配置;但是在工作中的电脑一般都是8G或者16G的运行内存,所以我们需要手动去修改默认的IDEA配置。二、手动修改IDEA配置步骤找到IDEA安装的bin目录打开idea.exe.vmoptions文件关键的三个参…

    2022年5月20日
    722
  • Linux重命名网卡名称

    Linux重命名网卡名称在 linux 中设置了两个网卡 配置完 ifcfg 文件后 便直接 servicenetwo 但是发现一重启就跳回自动分配的 IP 这是因为我直接在配置文件中修改了网卡名称而没修改配置 解决如下 1 先检查 ifcfg 文件中 BOOTPROTO 是否为 static ONBOOT 是否为 yes 都修改完成后如若还不行则进行下面操作 2 修改 etc sysconfig grub 文件 给 GRUB CMDLINE LINUX 参数中增加 net ifnames 0biosdevname 03 用命令 grub

    2026年3月17日
    2
  • centos7 vmware(静态IP)

    文章目录1.设置虚拟机网络2.设置宿主机网卡信息3.修改配置文件4.测试这里在NAT模式下进行设置。1.设置虚拟机网络对应于NAT模式,虚拟机应该设置VMnet8,点击编辑-&gt;虚拟网络编辑器,如图:点击更改设置,进入下图界面,选中VMnet8,取消勾选使用本地DHCP服务将IP地址分配给虚拟机点击NAT设置,进入下图界面在子网IP网段中选一个IP作为网关IP并记住(后面有…

    2022年4月11日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号