思路1:
用一个长度为k的list存放k个最小数字,遍历数组,每来一个数,将这个数和list中的最大数比较,如果比最大数小,那就把最大数换出来。
这个思路是对的,不过可以接着优化。不用list,而是用一个大根堆。
大根堆的定义:
一棵满二叉树;根 > left , right
数组中大根堆的存放方式:
index 为 i 的节点的root 的index为 (i-1)//2;它的左右子节点的index为 2*i+1 ,2*i+2
自己构建大根堆/小根堆:
# -*- coding:utf-8 -*-
import heapq
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
if k>len(tinput) or k==0:
return []
# 用前 k 个数构建大根堆
maxh = []
for num in tinput[:k]:
heapq.heappush(maxh,-num)
# 依次把数插入大根堆
for num in tinput[k:]:
if num < -maxh[0]:
heapq.heapreplace(maxh,-num)
for i in range(len(maxh)):
maxh[i] = -maxh[i]
maxh.sort()
return maxh
def swap(h,i,j):
temp = h[i]
h[i] = h[j]
h[j] = temp
j
def buildMaxStack(stack,start,n): #根据stack构建大根堆,从i到j排序
# n = len(stack)-1
i = n//2-1
while i >=0:
if stack[i] > max([stack[2*i+1],stack[2*i+2]]):
pass
else:
if max([stack[2*i+1],stack[2*i+2]]) == stack[2*i+1]:
self.swap[stack,2*i+1,i]
if 2*(2*i+1)+1 > n :
pass
i-=1