[C++][Leetcode][TopK]前K大问题+前K高频(堆+map)

本文介绍了在C++中利用堆和map解决LeetCode中关于找到数组和数据流中前K大元素及前K高频元素的问题,包括215. 数组中的第K个最大元素、703. 数据流中的第K大元素、面试题 17.14. 最小K个数和347. 前 K 个高频元素。讨论了快速排序、优先队列(最小堆)等算法的应用,并给出了相关代码实现。
摘要由CSDN通过智能技术生成

前两天面试的时候,面试官问了前K大的问题:先是找前K大数,其次是前K高频数。按照面试官的思路一道一道展开~

对总体过程中思考的知识点进行一个总结:

  • 为什么快排常用?
    • 在大规模数据的时候,快速排序只会线性增长,而堆排序增加幅度很大,会远远大于线性。
    • 堆排序指针寻址会耗费很多时间,但是快速排序的话只是移动到前后位置。
    • 参考博文为什么快排最好
  • 介绍一下C++构造函数?
    • 构造函数没有返回值
    • 构造函数用作初始化
    • 构造函数可以重载
  • 点操作符和箭头操作符的区别?
    • 点操作符的对象是实体
    • 箭头操作符的对象是指针
  • C++ 优先队列 堆的使用方式?如何自定义?
  • 为什么sort函数自定义cmp,在类里必须加static关键字?
    • sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数。非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,无法再sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。参考博文

 

目录

1.  Leetcode 215. 数组中的第K个最大元素

2. Leetcode 703. 数据流中的第K大元素

3. Leetcode 面试题 17.14. 最小K个数

4. Leetcode 347. 前 K 个高频元素

 


1.  Leetcode 215. 数组中的第K个最大元素

  • 题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 思路分析

这个问题有一种非常常见的思路,就是排序,然后取第K个元素即可。最好的时间复杂度是nlogn。但是这个思路,显然不能让面试官满意。说到排序,我们常用的就是快速排序。排序排序有一个partion函数,设定一个哨兵,每次把一个数组分成两部分,前部分小于哨兵元素(或者大于),后部分大于哨兵元素(或者小于)。这样每次调用一次partion函数就可以将一个元素放在其应该在的位置上。我们要求取的是第K大的元素,我们并不关心前k-1个元素是否有序。所以我们可以采用partion函数来寻找第K大的元素。按照通常的解法,我们选取第一个元素作为哨兵。经过一轮partion,如果当前元素的下标小于k-1,表示我们要找的第K大的元素在当前元素的后半部分,否则反之。这样我们最多调用K次partion就可以找到第K大的元素,时间复杂度为Klogn.

  • 代码设计
class Solution {
public:
    void partion(vector<int>&nums,int left,int right,int k)
    {
        if(left<right)
        {
            int privot=nums[left];
            int i&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值