题解 | #【模板】堆#

【模板】堆

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

class MaxHeap():
    def __init__(self):
        self.heap = []
    
    def push(self, x):
        self.heap.append(x)
        self._sift_up(len(self.heap) - 1)
    
    def top(self):
        if len(self.heap) == 0:
            return 'empty'
        return self.heap[0]
    
    def pop(self):
        if len(self.heap) == 0:
            return 'empty'
        #将下层元素上浮到合适位置
        max_val = self.heap[0]
        last_val = self.heap.pop()
        
        if len(self.heap) > 0:
            self.heap[0] = last_val
            self._sift_down(0)
        
        return max_val
    #从给定位置向上移动元素,将给定索引i的元素与其父节点进行比较。如果当前元素大于其父节点,就交换它们的位置,使得当前元素上浮到更高的层级
    def _sift_up(self, i):
        while i > 0 and self.heap[i] > self.heap[(i - 1) // 2]:
            self.heap[i], self.heap[(i - 1) // 2] = self.heap[(i - 1) // 2], self.heap[i]
            #根据堆的完全二叉树特性,i的父节点索引值为(i - 1) // 2,向下取整
            i = (i - 1) // 2
    #从给定位置向下移动元素
    def _sift_down(self, i):
        max_idx = i
        #根据堆的完全二叉树特性,索引为i的节点的左子节点的索引是(2i + 1)
        left = 2 * i + 1
        right = 2 * i + 2
        
        if left < len(self.heap) and self.heap[left] > self.heap[max_idx]:
            max_idx = left
        
        if right < len(self.heap) and self.heap[right] > self.heap[max_idx]:
            max_idx = right
        
        if max_idx != i:
            self.heap[i], self.heap[max_idx] = self.heap[max_idx], self.heap[i]
            self._sift_down(max_idx)


n=input()
myheap=MaxHeap()
for i in range(int(n)):
    a=input().split()
    if a[0]=='push':
        myheap.push(int(a[1]))
    elif a[0]=='top':
         print(myheap.top()  )
    else:
        print(myheap.pop() )


全部评论

相关推荐

#牛客AI配图神器#和波主熟的朋友们都知道,波主真的很挺贪玩的哈哈哈哈很少看八股,也不爱看。。可能你们现在拷打波主八股会支支吾吾...回想我的面试,似乎都是围绕着我会的地方问,大概是最近和宿佬还有学长学到的引导面试罢...注意,此文只适合对面试技巧提升,并不是说可以不学八股啊喂!!回忆本人的面试经验,面试官刚拿到你的简历,对你是一无所知的,那其实他会根据印象深的东西对你进行提问,所以我们在简历方面可以做一个引导。面试开头是很正常的自我介绍,很多人会觉得随便说一下就好,但其实我们可以在这里也做一个引导的,而且多说一点也可以给面试官时间看你的简历,所以这里也可以准备一下。然后就是具体提问了,对实习...
nokotan:佬tql,还很谦虚。个人决定佬说得很对,要有意把面试官提问引导到简历项目上,但前提是自己对项目一定要熟悉。项目的需求背景、难点痛点、已有方案的不足、解决方案的实现都得有认知,虽然我们实习大多数是打杂,但是不影响我们偷文档学业务。只要能把上面几个点做到自圆其说,那基本就有6、7成把握了
点赞 评论 收藏
分享
求内推找工作
在写面经的00后很英俊:别听他们扯犊子说技术栈放前面,你是校招生,把你荣誉证书和项目经历换个位置,你那么多奖,能留住hr的眼光,才会继续看下去
点赞 评论 收藏
分享
牛仔知道哦:你是我见过最美的牛客女孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务