9.28 堆排序

首先,最重要的还是复习、复习、复习

堆排序,也是一种思想,遇到类似题目求解TopK的时候都可以先想到堆排序。

堆排序分大堆顶和小堆顶

升序----使用大顶堆

降序----使用小顶堆

这篇文章写的比较清楚:https://www.cnblogs.com/lanhaicode/p/10546257.html

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

思路应该都有,具体就是实现的方法
1、利用map统计字符出现个数
2、按照个数排序
3、提出前K个

// 时间复杂度:O(nlogk)
// 空间复杂度:O(n)
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> map; // map<nums[i],对应出现的次数>
        for (int i = 0; i < nums.size(); i++) {
            map[nums[i]]++;
        }

        // 对频率排序
        // 定义一个小顶堆,大小为k
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;

        // 用固定大小为k的小顶堆,扫面所有频率的数值 
        for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
            pri_que.push(*it);
            if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
                pri_que.pop();
            }
        }

        // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒叙来输出到数组
        vector<int> result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;

    }
};

另外STL 最大堆、最小堆的应用可以看https://blog.csdn.net/my_lovely_lemon_tree/article/details/78007316

operator用法可以看https://blog.csdn.net/woxiaohahaa/article/details/53191247

c++ map与unordered_map区别及使用https://blog.csdn.net/qq_21997625/article/details/84672775

::iterator it 属于C++的迭代器,常用*it来访问元素
https://blog.csdn.net/u010112268/article/details/81111086


现在需要考虑毕业问题,还有考虑工作问题,很焦虑。感觉刷题到现在好像没有什么起色,机械的背一些东西,经不起深挖。整个论文架构还没有想好,真的要提升效率了。以前总是想的太多,做的太少。没有目标的话,做事就是一盘散沙。
现在秋招还要继续找,但是也要持续到春招。希望能够有一个好结果。顺利毕业,找到可心的工作。
越长大似乎越能看清楚自己的上限,有时候总在想,我的选择是正确的么,我以后的生活似乎已经被预见到了。但还是总想着拼一把,我好像是那种能力匹配不上抱负的人吧。我不会放弃的,我需要的应该是计划、方法、努力。
日常打气,加油

全部评论

相关推荐

掩卷思:这简历做的感觉好简陋啊,找个模板呗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务