前两天面试的时候,面试官问了前K大的问题:先是找前K大数,其次是前K高频数。按照面试官的思路一道一道展开~
对总体过程中思考的知识点进行一个总结:
- 为什么快排常用?
- 在大规模数据的时候,快速排序只会线性增长,而堆排序增加幅度很大,会远远大于线性。
- 堆排序指针寻址会耗费很多时间,但是快速排序的话只是移动到前后位置。
- 参考博文为什么快排最好
- 介绍一下C++构造函数?
- 构造函数没有返回值
- 构造函数用作初始化
- 构造函数可以重载
- 点操作符和箭头操作符的区别?
- 点操作符的对象是实体
- 箭头操作符的对象是指针
- C++ 优先队列 堆的使用方式?如何自定义?
- 参考博文自定义堆
- 为什么sort函数自定义cmp,在类里必须加static关键字?
- sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数。非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,无法再sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。参考博文
目录
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&