找到无序数组中第K大的数,这道题蜜汁经典,腾讯和头条的面试中都被问到了,我一般用的都是大小为K的小顶堆和快排扫一半这两种思路做这道题,直到前几天面试头条的时候,终面面试官问,有没有 O(1) 空间【严格的 O(1) 空间,即不能用递归】且不改变原数组的情况下,找第K大的数。当场没有想起来,下来之后突然就想到了。所以特此来总结一下。
找数组第K大的数 ,Leetcode上有一道原题:
215. Kth Largest Element in an Array
常规的两种方法——小顶堆和快排分治
快排扫一半
就是快排每次扫完之后,看轴值得位置在哪里,如果大于k则扫前一半,小于k则扫后一半,如果等于k则说明找到了【PS,这里的k是指从0开始数的第K大的数】
这种方法的时间复杂度,平均意义上是 O(n)