题解 | #【模板】堆#

【模板】堆

https://www.nowcoder.com/practice/13f61c8c92404f5ea5d6fa4c692869fb

class Heap:
    def __init__(self) -> None:
        self.a = [0]    # 让下标从1开始,方便计算,该数不为堆中元素
        self.size = 0   # 堆元素数量

    def push(self, x):
        self.a.append(x)
        self.size += 1
        k = self.size
        while k > 1 and self.a[k//2] < self.a[k]:
            self.a[k//2], self.a[k] = self.a[k], self.a[k//2]
            k = k//2
        
    def top(self):
        if self.size == 0:
            return 'empty'
        return self.a[1]

    def pop(self):
        if self.size == 0:
            return 'empty'
        top = self.a[1]
        self.a[1] = self.a[-1]
        self.a.pop()
        self.size -= 1
        
        k = 1
        while 2*k <= self.size:
            j = 2*k
            if j < self.size and self.a[j] < self.a[j+1]:
                j += 1
            if self.a[k] >= self.a[j]:
                break
            self.a[k], self.a[j] = self.a[j], self.a[k]
            k = j
        return top


n = int(input())
hp = Heap()
for i in range(n):
    line = input().split()
    if line[0] == 'push':
        hp.push(int(line[1]))
    elif line[0] == 'top':
        print(hp.top())
    elif line[0] == 'pop':
        print(hp.pop())

全部评论

相关推荐

09-29 16:59
已编辑
门头沟学院 Java
牛客96609213...:疯狂背刺,之前还明确设置截止日期,还有笔试,现在一帮人卡在复筛,他反而一边开启扩招,还给扩招的免笔试,真服了,你好歹先把复筛中的给处理了再说
投递大疆等公司10个岗位
点赞 评论 收藏
分享
notbeentak...:孩子,说实话,选择很重要,可能你换一个方向会好很多,但是现在时间不太够了,除非准备春招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务