1つのアイデア:
より少ない最大数、変化のうち、最大数よりもあれば、長さkのk番目のアレイを介して最小の番号、番号のそれぞれの格納されたリストが、この数はになり、リスト内の最大数を比較します。
この考え方は正しいですが、その後に最適化することができます。リストを行いますが、大きな根ヒープを持ちます。
大きなルートヒープ定義:
完全なバイナリツリー、根>左、右
配列大きなルートヒープ保存方法:
インデックスのルートノードのiがインデックス(I-1)// 2であり、その子ノードのインデックスは、約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