题解 | #最小的K个数#

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param input int整型一维数组 
# @param k int整型 
# @return int整型一维数组
#
class Solution:
    def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
        # write code here
        # 如果用大顶堆的话,建立大小为k的大顶堆,如果剩下数字里面小于顶,就把顶端挪走,替换成小的值,再堆化,最后留下的k个即为结果。
        def heapify(arr, i):
            left = 2*i + 1
            right = 2*i + 2
            pos = i
            if left < arr_len and arr[left] > arr[pos]:
                pos = left
            if right < arr_len and arr[right] > arr[pos]:
                pos = right
            if pos != i:
                arr[i], arr[pos] = arr[pos], arr[i]
                heapify(arr, pos)
        
        def build_max_heap(arr):  # 原地,所以不用返回值
            import math
            for i in range(math.floor(len(arr)/2), -1, -1):
                heapify(arr, i)
            
        if k == 0 or not input:
            return []
        temp = input[:k]
        arr_len = k
        build_max_heap(temp)
        for i in range(k, len(input)):
            if input[i] < temp[0]:
                temp[0] = input[i]
                heapify(temp, 0)
        # 时间复杂度为 O(nlogk)
        return temp

全部评论

相关推荐

Java抽象带篮子:简历怎么写可以看看我发的帖子,你的第一个是实习经历吗?那怎么写的是你的第一个练手项目呢?简历写的怎么样直接投小厂面试一下就知道了
没有实习经历,还有机会进...
点赞 评论 收藏
分享
fRank1e:吓得我不敢去外包了,但是目前也只有外包这一个实习,我还要继续去吗
点赞 评论 收藏
分享
码农索隆:单休一个月少休息4天,一年就是48天,平时节假日,别人3天假期,单休的两天
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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