题解 | #【模板】堆#

【模板】堆

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

class MaxHeap:
    def __init__(self):
        self.heap = []

    def push(self, x):
        self.heap.append(x)  # 将元素添加到末尾
        self._heapify_up(len(self.heap) - 1)  # 上浮调整,父节点的值小于当前节点的值则交换

    def top(self):
        if self.heap:  # 直接返回数组的第一个元素(即根节点)
            return self.heap[0]
        else:
            return "empty"

    def pop(self):
        if len(self.heap) == 0:
            return "empty"
        if len(self.heap) == 1:
            return self.heap.pop()

        root = self.heap[0]
        self.heap[0] = self.heap.pop()  # 用列表最后一个元素替换堆顶
        self._heapify_down(0)  # 下沉调整,如果当前节点小于最大的子节点,交换它们的位置。
        return root

    def _heapify_up(self, index):
        parent = (index - 1) // 2
        while index > 0 and self.heap[index] > self.heap[parent]:
            self.heap[index], self.heap[parent] = self.heap[parent], self.heap[index]
            index = parent
            parent = (index - 1) // 2

    def _heapify_down(self, index):
        size = len(self.heap)
        while True:
            left = 2 * index + 1
            right = 2 * index + 2
            largest = index

            if left < size and self.heap[left] > self.heap[largest]:
                largest = left
            if right < size and self.heap[right] > self.heap[largest]:
                largest = right

            if largest == index:
                break

            self.heap[index], self.heap[largest] = self.heap[largest], self.heap[index]
            index = largest


# 测试代码
n = int(input())
heap = MaxHeap()

for _ in range(n):
    command = input().split()

    if command[0] == "push":
        heap.push(int(command[1]))
    elif command[0] == "top":
        print(heap.top())
    elif command[0] == "pop":
        print(heap.pop())

全部评论
可以使用数组来模拟堆,并且需要实现三个基本操作:插入元素、获取堆顶元素、删除堆顶元素。 1. 插入元素(push 操作) 将新元素插入数组的末尾。 然后将这个新元素向上调整,直到其满足堆的性质(即父节点的值大于等于当前节点的值)。 向上调整过程(上浮): 比较当前元素与其父节点的大小。如果当前元素大于其父节点,交换两者的位置。 重复此过程,直到当前元素不再大于其父节点,或者当前元素已经成为根节点。 2. 获取堆顶元素(top 操作) 直接返回数组的第一个元素(即根节点)。 如果堆为空,返回 "empty"。 3. 删除堆顶元素(pop 操作) 用数组的最后一个元素替换堆顶元素,然后移除最后一个元素。 将新的堆顶元素向下调整,直到其满足堆的性质(即当前节点的值大于等于其子节点的值)。 向下调整过程(下沉): 比较当前节点与其两个子节点的大小。 如果当前节点小于最大的子节点,交换它们的位置。 重复此过程,直到当前节点不再小于它的子节点,或者当前节点没有子节点。
点赞 回复 分享
发布于 2024-08-28 19:12 尼日利亚

相关推荐

下北泽:都是校友,还是同届,我就说直白点,不委婉了,我相信你应该也不是个玻璃心,首先你觉得一个双非的绩点写简历上有用吗?班长职务有用吗?ccf有用吗?企业会关心你高数满分与否吗?第二,第一个项目实在太烂,一眼就能看出是外卖,还是毫无包装的外卖,使用JWT来鉴权,把热点数据放进Redis这两个点居然还能写进简历里,说难听点这两个东西都是学个几十分钟,调用个API就能完成的事情,在双非一本的条件下,这种项目你觉得能拿出手吗,第二个项目你写的东西和你的求职方向有任何的匹配吗?第三,计设那一块毫无价值,如果想突出自己会前端,直接写入专业技能不行吗,最后,专业技能里像深入理解JVM底层原理这种你觉得这句话你自己真的能匹配吗?都是校友加上同届,我措辞直接,但希望能点出你的问题,想进大厂还得继续沉淀项目和学习
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务