题解 | #寻找第K大#

寻找第K大

http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

这道题主要考察排序算法,之前用快排写的,发现测试用例改了之后没办法通过了。故改用堆排序

堆排序由两部分构成:

1.heapify用来调整堆的结构(使堆这种特殊的完全二叉树中的父节点大于两个孩子节点,但两个孩子节点之间没有大小要求)

2.heapsort部分用来将堆的首元素与末尾元素交换,然后再调用heapify使除了末尾元素之外的n-1个元素来继续形成大顶堆,然后再交换首尾元素,再调整使剩下n-2个元素形成堆,循环往复直至堆内只剩下最后一个元素。

根据堆排序的性质,最好最坏平均时间复杂度都为O(nlogn),且不需要额外开辟空间存储原数组,故空间复杂度O(1)

    def findKth(self , a: List[int], n: int, K: int) -> int:
        def heapify(a, n, i):
            largest = i
            lson = 2 * i + 1
            rson = 2 * i + 2
            if lson < n and a[lson] > a[largest] :
                largest = lson
            if rson < n and a[rson] > a[largest]:
                largest = rson
            if largest != i:
                a[largest], a[i] = a[i], a[largest]
                heapify(a, n, largest)
        def heapsort(a, n):
#            建大顶堆
            for i in range(len(a)//2 - 1, -1 ,-1):
                heapify(a, n, i)
#            排序
            for i in range(len(a) - 1, 0, -1):                       
                a[0], a[i] = a[i], a[0]
                heapify(a, i, 0)
        heapsort(a, n)
        return a[-K]
全部评论

相关推荐

三分入剑:我觉得还是学历问题 如果你真的想要进大厂不想在小厂的话读个211得研究生吧 我感觉简历还没你好呢 我都实习了俩月了 我投了一百多份能投出20多份简历 能面试六七次 我们部门只招研究生了都 现在连9本都很难找到像样的大厂了 你又没打过rm这种 我觉得想要进步的话就考个研究生吧
点赞 评论 收藏
分享
01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务