# -*- 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

​