题解 | #最小的K个数#python三种方法实现sort、heap、partition

最小的K个数

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

# -*- coding:utf-8 -*-
import heapq
#利用heapq实现一个大根堆
def heapify(x):
    for i in range(len(x)):
        x[i] = -x[i]
    heapq.heapify(x)

def heappush(heap, item):
    heapq.heappush(heap, -item)
def heappop(heap):
    return -heapq.heappop(heap)

class Solution:
    def GetLeastNumbers_Solution1(self, tinput, k):
        #直接快排 + 切片, O(nlog(n))
        if k == 0:
            return []

        return self.quicksort(tinput.copy(), 0, len(tinput)-1)[:k]

    def GetLeastNumbers_Solution2(self, tinput, k):
        #维护一个size为k的大根堆, 当堆满的时候,新的元素必须小于根节点才能插入,并弹出根节点
        #O(nlog(k))
        if k == 0:
            return []
        if k == len(tinput):
            return tinput

        heap_k = tinput[:k].copy()
        heapify(heap_k)
        for i in tinput[k:]:
            if i < -heap_k[0]:
                heappop(heap_k)
                heappush(heap_k, i)
        return [-e for e in heap_k]

    def GetLeastNumbers_Solution3(self, tinput, k):
        #利用快排分治的思想, O(n)
        if k == 0:
            return []
        if k == len(tinput):
            return tinput
        return self.get_least_k(tinput, 0, len(tinput)-1, k)[:k]

    def get_least_k(self, arr, low, high, k):
        #利用快排分治的思想
        i = low
        j = low
        pivot = high
        for j in range(low, high):
            if arr[j] < arr[pivot]:
                tmp = arr[j] 
                arr[j] = arr[i]
                arr[i] = tmp
                i += 1
        tmp = arr[i] 
        arr[i] = arr[pivot]
        arr[pivot] = tmp

        if i == k:
            return arr
        else:
            if i < k:
                arr = self.get_least_k(arr, i+1, high, k)
            else:
                arr = self.get_least_k(arr, low, i-1, k)
        return arr

    def quicksort(self, arr, low, high):
        if high - low < 2:
            return 
        i = low
        j = low
        pivot = high
        for j in range(low, high):
            if arr[j] < arr[pivot]:
                tmp = arr[j] 
                arr[j] = arr[i]
                arr[i] = tmp
                i += 1
        tmp = arr[i] 
        arr[i] = arr[pivot]
        arr[pivot] = tmp

        self.quicksort(arr, low, i-1)
        self.quicksort(arr, i+1, high)

        return arr

​
全部评论

相关推荐

今天 19:51
已编辑
叮咚买菜
牛客吹哨人:建议细说...哨哥晚点统一更新到黑名单:不要重蹈覆辙!25届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1317104
叮咚买菜稳定性 10人发布 投递叮咚买菜等公司10个岗位 >
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务