劍指offer全集詳解python版——最小的K個數

題目描述:
輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

思路:

非常經典的題,一般是兩種思路,快排或者堆(堆甚至有API)。

代碼:

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if not tinput or k <= 0 or k > len(tinput):
            return []
        heap = Heap()
        for i in range(len(tinput)):
            if i <= k-1:
                heap.push(tinput[i])
            else:
                if heap.top() > tinput[i]:
                    heap.pop()
                    heap.push(tinput[i])
        return sorted(heap.heap)              
                     
                 
 
class Heap():
    def __init__(self):
        self.heap = []
 
    def top(self):
        return self.heap[0]
     
    def push(self, x):
        self.heap.append(x)
        self.swim(0, len(self.heap)-1)       
         
    def pop(self):
        self.heap[0], self.heap[-1] = self.heap[-1], self.heap[0]
        self.sink(0, len(self.heap)-2)
        return self.heap.pop()       
     
    def sink(self, low, high):
        i = low
        j = 2*i+1
        while j <= high:
            if j+1<=high and self.heap[j]<self.heap[j+1]:
                j+=1
            if self.heap[i] >= self.heap[j]:
                break
            self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
            i = j
            j = 2*i+1
    def swim(self, low, high):
        j = high
        i = (j-1)/2
        while i >= low:
            if self.heap[i] >= self.heap[j]:
                break
            self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
            j = i
            i = (j-1)/2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章