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

题目来源: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值