如何找出大小为n的数列中第k大的数?
前几天面试吹牛说自己很擅长DS,结果被自摆一道,面试官问我如何在大小为n的数列中找出第k大的数?开始觉得不难,胡乱扯了几个方法,觉得很得意,结果回来后一想才发现答的差强人意,我竟然以为桶排序是bestsolution。。。于是开始怀疑自己智商。以后不能把话说的这么满。。。
google之,方法列于下:
简单的解法比如用quicksort的思想,,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n);
如此递归下去。
再有就是建立数列的最大堆,依次pop出k次即可。O(n * logk);
利用hash保存数组中元素Si出现的次数,利用基数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)。而桶排序虽然思想很妙,但在数子分布很散的情况下太过消耗空间,典型的用空间换时间,Not a good idea!
浙公网安备 33010602011771号