安全プランを証明する:kの最小数を取得します

 

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
        
        
        
        

 

 

 

公開された82元の記事 ウォンの賞賛2 ビュー4349

おすすめ

転載: blog.csdn.net/qq_22498427/article/details/104833631