NC88 寻找第K大

1 无脑sort选第K个

a.sort(reverse=True)
a[]

2 堆,直接无脑调用nlargest(K, a)[-1]

import heapq
heapq.nlargest(K,a)[-1]

3 维护一个大小为K的最小堆

建堆:O(n)
最终为O(nlogK)
不满K个,直接进堆操作
满了K个,如果当前元素 > 堆顶元素,那就替换该元素,建堆。

  • 这样保证了,最后遍历完毕后,K大小的堆的堆顶存储的就是第K大元素
import heapq
class Solution:
    def findKth(self, a, n, K):
        # write code here
#         return heapq.nlargest(K, a)[-1]
        heap = []
        for i in range(n):
            item = a[i]
            if i < K:
                heapq.heappush(heap, item)
            else:
                if a[i] > heap[0]:
                    heapq.heapreplace(heap, item)
        return heap[0]

4 借鉴 快排 思路K

# -*- coding:utf-8 -*-
import heapq
class Solution:
    def findKth(self, a, n, K):
        # write code here
#         return heapq.nlargest(K, a)[-1]
#         heap = []
#         for i in range(n):
#             item = a[i]
#             if i < K:
#                 heapq.heappush(heap, item)
#             else:
#                 if a[i] > heap[0]:
#                     heapq.heapreplace(heap, item)
#         return heap[0]
        return self.qsort(a, 0, n-1, K)

    def qsort(self, a, low, high, K):
        p = self.partition(a, low, high)
        if K == (high - p + 1):
            return a[p]
        elif (high - p + 1) > K:
            return self.qsort(a, p+1, high, K)
        else:
            return self.qsort(a, low, p-1, K-( high-p + 1) )

    def partition(self, a, low, high):
        l, r = low, high
        pivot = a[l] # 中轴值选择最左边一定要从右边r指针开始动,把l的指针指向当做一个空箱子,可以覆盖值
        while l < r:
            #动手,动右指针
            while l < r and a[r] >= pivot:
                r -= 1
            a[l] = a[r] #
            #动左指针
            while l < r and a[l] <= pivot:
                l += 1
            a[r] = a[l]
        a[l] = pivot
        return l
        
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值