29.最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
记录
考点:时间效率。
如果对排序有兴趣,可以看讨论中的热评牛客。
方法一:
sorted
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if len(tinput) < k or k == 0:
return []
tmp = sorted(tinput)
return tmp[:k]
方法二:
堆排序,复杂度O(nlogk)。
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
#常规判断
if k > len(tinput) or k == 0:
return []
n = len(tinput)
a = tinput[:k]
# 前k个数建立大顶堆
#非叶子节点
for i in range(k//2-1, -1, -1):
self.initiate(i, a, k)
# 对剩下的n-k个数进行判断
for i in range(k, n):
if tinput[i] < a[0]:
a[0] = tinput[i]
self.initiate(0, a, k)
for i in range(len(a)-1, -1, -1):
a[i], a[0] = a[0], a[i]
self.initiate(0, a, i)
return a
def initiate(self, index, a, length):
#非叶子节点
temp = a[index]
#该节点的左节点
j = index*2+1
while j < length:
#左右比较
if j+1 < length and a[j+1] > a[j]:
#指向右
j += 1
#和该节点的根节点比较
if a[j] > temp:
#比根节点大,替换根节点
a[index] = a[j]
index = j
else:
break
#到下一层
j = j*2+1
a[index] = temp