题解 | #最小的K个数#

最小的K个数

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

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param input int整型一维数组 
# @param k int整型 
# @return int整型一维数组
#
import heapq
class Solution:
    # def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
    #     """
    #     method_1: 
    #     思路: 
    #     step1: 列表排序
    #     step2: 按照k值输出列表指定长度的子列表
    #     """
    #     # write code here
    #     # rst = list()
    #     if len(input)== 0 or k == 0:
    #         return []
    #     input.sort()
    #     # print("input: ", input)
    #     print("rst: ", input[:4])
    #     return input[:k]

    def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
        """
        method_2: 堆排序, 有限队列。
        优先队列 PriorityQueue, 是一种内置的基于堆排序的容器,氛围大定堆 和小顶堆, 大顶堆的堆定为最大元素,其余更小的元素在堆下方,小顶堆与其刚好相反。

        思路: 
        step1: 利用 input数组中的前k个元素,构建一个大小为k的大顶堆,堆顶为这k个元素的最大值。
        step2: 对于后续的元素,一次比较其与堆顶的大小,若是比堆顶小,则堆顶弹出,再将新数加入堆中, 直至数组结束,保证堆中的k个最小。
        step3: 最后将堆顶依次弹出即是最小的k个数。
        """
        rst = list()
        if len(input) >= k and k != 0:
            pq = list()
            # 小顶堆, 每次都要乘-1?
            for i in range(k):
                heapq.heappush(pq, (-1 * input[i]))
            for i in range(k, len(input)):
                # 较小元素入堆
                if (-1 * pq[0]) > input[i]:
                    heapq.heapreplace(pq, (-1 * input[i]))

            # 堆中元素取出入数组
            for i in range(k):
                rst.append(-1 * pq[0])
                heapq.heappop(pq)

        return rst[::-1]
        pass
		
		核心是: 先排序,之后输出,如果吧排序做好,后续的输出就不成问题。

全部评论

相关推荐

2025-12-16 17:17
门头沟学院 产品经理
烤点老白薯:他第二句话的潜台词是想让你帮他点个瑞幸或者喜茶啥的
mt对你说过最有启发的一...
点赞 评论 收藏
分享
白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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