题解 | #【模板】堆#

【模板】堆

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() )


全部评论

相关推荐

09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 75人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务