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

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

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

Example 1:

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

Example 2:

1. Input: nums = [1], k = 1
2. 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.

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。


示例 1:


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

输出: [1,2]

示例 2:


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

输出: [1]

说明:


你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。

你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。


桶排序:

参考:对6万名员工排序,要求时间复杂度O(n)http://blog.sina.com.cn/s/blog_13c6397540102wzv8.html

解法1:桶排序的拓展

C++实现

//1.先建立哈希表
//2.建立桶结构,行为次数,列为个数
//3.从桶的最后一行开始压栈
//4.从栈中按照从小到大的顺序输出元素(k个)
class Solution 
{
public:
    vector<int> topKFrequent(vector<int>& nums, int k) 
    {
          unordered_map<int, int> hash;
        vector<vector<int>> buckets(nums.size()+1);
        vector<int> ret;
        for(int num:nums) //此时的num是nums中的元素
             hash[num]++;
        for(auto it:hash) //hash有键(元素)和值(次数)
          buckets[it.second].push_back(it.first);//二维数组行为次数 列为出现此次数的元素
        for(int i=buckets.size()-1; i>0; --i) //从最后一行开始,最大的次数开始
        {   
            //该最大的次数内的列循环,有几个出现同样的次数
            for(auto num:buckets[i])//C++11 的新特性 num用来在遍历过程中获得容器里的每一个元素 
            {
                ret.push_back(num);//从大到小的压入栈
                if(ret.size() == k) return ret;//满足k个退出
            }
        }
        return ret;
    }
};

具体描述:

cbee75841c966247f1af476bb39e055b_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png

执行结果:

不稳定?每次提交的结果不同

18ae923d14669a558524f964613067c6_20190306233715986.png


目录
相关文章
|
15天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
30 1
|
21天前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
29 0
|
22天前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
27 0
|
22天前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
29 0
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
算法
LeetCode第27题移除元素
这篇文章介绍了LeetCode第27题"移除元素"的解题方法,通过使用双指针技巧,有效移除数组中特定值的元素并返回新数组的长度。
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
52 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
102 2