题目描述:
输入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