您的位置:首页 > 其它

【算法分析与设计】【第三周】215. Kth Largest Element in an Array

2017-09-24 20:41 459 查看
题目来源:https://leetcode.com/problems/kth-largest-element-in-an-array/description/

上周刚学完分治,周末复习一下。时时温故,梳理一下,看看能否知新。

分治算法中的经典问题,topK肯定占有一席之地,也是《算法概论》中的selection问题。

topK与快排的原理类似。所以先简单复习一下快速排序:

以{4,3,5,7,8,9,2,1}为例,

首先在这个序列中随便找一个数作为基准数。方便起见,找第一个数4;

分别从初始序列{3,2,5,7,8,9,2,1}两端开始往中间走。

用两个变量i和j,分别指向序列最左边和最右边。分别用i和j来记录走过的下标,先从右往左找第一个小于4的数,再从左往右找第一个大于4的数,然后交换他们;

{4,3,5,7,8,9,2,1}

{4,3,1,7,8,9,2,5}

i和j归回原位,分别指向序列最左边和最右边。重复以上过程,直至某一次i与j碰头,即

i == j


此时,

{4,3,1,2,8,9,7,5}

i == 4
j == 4,与i碰头,不能继续向前


于是,将基准书和第i个数交换。到此,第一轮交换结束。

换一个基准数,重复以上过程。

topK可以算是快排的变种,利用快排的思想,将数组分为3部分(或2部分,3部分理解起来更快些),分而治之。

首先,也是先找一个基准数。假设第v个数为基准数。考虑到重复元素的问题,我们在这里将数组分为3部分,小于基准数的元素放在一起称作SL,等于基准数的元素放在一起称作SV,大于基准数的元素放在一起称作SR。

然后,比较k与各个集合的大小关系。

k与各个集合的大小关系topK的位置
k <= sizeof(SR)第k大的数在右半边SR中
sizeof(SR) < k <= ( sizeof(SL)+sizeof(SV) )这就是第k大的数
k <= sizeof(SR)第k大的数在左半边SL中
与快排有所不同的是,topK一轮以后就知道第K个元素在哪一半里,下一趟只处理那一半就行了。

topK算法中比较玄妙的是v的取法,这直接决定了算法的时间复杂度。这里就不深入讨论了。

当然,此法也可求前k大的数。

参考:

http://ahalei.blog.51cto.com/4767671/1365285
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: