[leetcode]215. Kth Largest Element in an Array

本文介绍了一种使用小顶堆实现查找数组中第K大数的方法。通过建立小顶堆并迭代比较,最终堆顶元素即为所需。适用于熟悉堆排序原理并对高效查找算法感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给一个数组,求出数组中的第K大数,比如[3,2,1,5,6,4] 求出第2大数,则为5
分析:

复习堆排序,对于这道题来讲,找第k大数,可以通过一个小顶堆实现。首先取数组中的前k个数组成小顶堆(具体堆的调整可以百度,或者看代码应该就理解),此时堆顶的数字就是这k个数字里面的第K大数,然后从每次从剩余的数组中拿出一个数字和堆顶的数字进行比较,如果比堆顶数字小,则直接丢弃;如果大于堆顶数字,则替换该数字,重新进行堆调整,调整完成之后堆顶的数字依旧是已经处理过的数字中的第K大数。如此重复执行,直到数据处理完毕,此时堆顶的数字就是第K大数

代码:
#!/usr/bin/env python
class Solution(object):
    def __init__(self):
        self.nums_t = []
    def min_heap(self, i, l):
        L = i * 2
        R = i * 2 + 1
        min = i
        if L <= l and self.nums_t[L-1] < self.nums_t[i-1]:
            min = L
        if R <= l and self.nums_t[R-1] < self.nums_t[min-1]:
            min = R
        if min != i:
            tp = self.nums_t[min-1]
            self.nums_t[min-1] = self.nums_t[i-1]
            self.nums_t[i-1] = tp
            self.min_heap(min, l)

    def build_min_heap(self):
        l = len(self.nums_t)
        for i in range(l/2, 0, -1):
            self.min_heap(i, l)

    def findKthLargest(self, nums, k):
        self.nums_t = nums[0:k]
        self.build_min_heap()
        nums_leave = nums[k:]
        LL = len(nums_leave)
        for i in range(0, LL):
            if nums_leave[i] > self.nums_t[0]:
                self.nums_t[0] = nums_leave[i]
                self.min_heap(1, len(self.nums_t))
        return self.nums_t[0]
# 下面为测试代码
if __name__ == '__main__':
    nums = [4,1,3,2,16,9,10,14,8,7]
    l = 5
    s = Solution()
    ans = s.findKthLargest(nums, l)
    print "ans : ", ans

如代码所示,对于前K个数字进行建小顶堆,然后对于剩余的数字进行比较处理,最后堆顶数字即为所求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值