leetcode 347 前k个高频元素

简介: leetcode 347 前k个高频元素

前k个高频元素


2bb955e991ea4f309d228a2844ac276e.png


vector排序法

class Solution {
public:
  //对vector排序的谓词,前面加static
    static bool compare(pair<int, int> map1, pair<int, int> map2) 
    {
        return map1.second > map2.second;
    }
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> num_map; //map统计出现的次数
        vector<pair<int ,int >> buf; //缓存vector,用作排序
        vector<int> result;
        for( auto i:nums)
        {
            num_map[i]++; //统计出现的次数
        }
        for ( auto it : num_map) //将map中的数据存到vector中,用pair的形式
        {
            buf.push_back(make_pair(it.first, it.second)); 
            // cout<<it.first<<' '<<it.second<<endl;
        }
        sort(buf.begin(), buf.end(),compare);    //排序,按照value的大小排序
        for(int i = 0 ; i<k ;i++)
        {
            result.push_back(buf[i].first);   //前k个值为结果
        }
        return result;
    }
};

小顶堆

class Solution {
public:
    // 小顶堆的比较函数
    class mycomparison {
    public:
        bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
            return lhs.second > rhs.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> num_map;
        vector<int> result;
        // 对频率排序
        // 定义一个小顶堆,大小为k
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison>  pri_que;
        for( auto i:nums)
        {
            num_map[i]++;
        }
        for ( auto it : num_map)
        {
            pri_que.push(it);
            if (pri_que.size() > k)// 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
            { 
                pri_que.pop();
            }
        }
        for(int i = k - 1; i >= 0; i--) //小顶堆,先出的小,倒着装入数组
        {
            result.push_back( pri_que.top().first);
            pri_que.pop();
        }
        return result;
    }
};

二刷

map排序

class Solution {
public:
    static bool cmp(const pair<int,int>&a, const pair<int,int>&b )
    {
        return a.second > b.second;
    }
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> my_map;
        vector<int> resulte;
        for(int i=0 ; i<nums.size() ;i++)
        {
            my_map[nums[i]]++;
        }
        vector<pair<int,int>> tmp(my_map.begin(),my_map.end()); 
        sort(tmp.begin(),tmp.end(),cmp);
        for(int i=0 ; i<k ;i++)
        {
            resulte.push_back(tmp[i].first);
        }
        return resulte;
    }
};
相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
36 1
|
1月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
33 0
|
1月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
30 0
|
1月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
32 0
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer II 082. 含有重复元素集合的组合
解决LeetCode平台《剑指 Offer II 082. 含有重复元素集合的组合》题目的Python代码实现,通过深度优先搜索算法找出所有和为特定目标值的数字组合,并在搜索过程中通过排序和跳过重复元素来避免解集中出现重复组合。
40 2
|
3月前
|
算法
LeetCode第27题移除元素
这篇文章介绍了LeetCode第27题"移除元素"的解题方法,通过使用双指针技巧,有效移除数组中特定值的元素并返回新数组的长度。
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
62 0
|
3月前
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
25 0