leetcode-347. 前K个高频元素

桶排序


题目详情

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


示例1:

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

示例2:

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

我的方法:

1.桶排序

顾名思义,桶排序的意思是为每个值设立一个桶,桶内记录这个值出现的次数(或其它属性),然后对桶进行排序。

代码:

class Solution 
{
public:
    vector<int> topKFrequent(vector<int>& nums, int k) 
    {
        unordered_map<int,int> counts;      
        int max_count = 0;
        for(const int & num : nums)         //遍历nums
        {
            max_count = max(max_count,++counts[num]);   //max_count用来记录最高频的数字的频率
           //这里++counts[num]实现 "数->频率"的map
        }

        vector <vector<int>> buckets(max_count + 1);  //二维数组的行为最高频
        for(const auto & p : counts)
        {
                   //行存频率          //列存该频率的数(可能不止一个)
            buckets[p.second].push_back(p.first);
            //实现 "频率->数"的buckets
        }

        vector<int> ans;
        for(int i = max_count; i >= 0 && ans.size() < k; --i) //i从高到低遍历k个(因为题目要求的是前K频繁的)
        {
            for(const int & num : buckets[i])                //这里C++的范围for就很好的跳过了buckets里的空行
            {                                                //比如频率有 5 3 2 1,就跳过了4这一行
            ans.push_back(num);                              //ans存储对应数字
            if(ans.size() == k)                              //够了之后break
            {
                break;
            }
            }
        }
        return ans;
    }
};
posted @ 2022-04-04 10:56  ggaoda  阅读(2)  评论(0编辑  收藏  举报  来源