寻找最大的K个数 解法二(python)

本文介绍了一种使用Python解决寻找数组中最大K个数问题的方法。通过随机选择元素对数组进行拆分,递归处理直到找到目标元素。在处理相同数值时,避免无限递归。最后给出了实现代码。
摘要由CSDN通过智能技术生成

思路:

1.对数组S进行拆分,从数组S中随机找出一个元素,将数组分成大于该元素和小于该元素的Sa和Sb。

2.当Sa中元素的个数大于或等于K,那么Sa中最大的K个元素就是数组S的最大的K个元素;

   当Sa中元素的个数小于K,那么数组S的最大的K个元素则为Sa中所有的数和Sb中的K-length(Sa)个元素。

   这样递归下去,可将问题分解成更小的问题,平均时间复杂度为o(N*log2k)。

3.应该注意一个问题,如果数组中有数值相同的数的情况。将随机找出的元素放到数组的最前面,方便后面处理。当遇到相同的值时,为了避免递归无法停止的情况,必须将相同的值分别分布在Sa和Sb中,我选择了将该元素放在Sb中,在遍历数组剩下的元素时,会将和该元素相等的元素放在Sa中,这样循环下去,就可以跳出递归。也可以直接不要和该元素相等的元素。


代码:

import random
def partition(s):
sa = []
sb = []
temp = random.randint(0,len(s)-1)
s[0],s[temp] = s[temp],s[0]
p = s[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值