堆原来这么秒啊

题目:给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k ,请你执行下述操作 恰好 k 次:

  • 选出任一石子堆 piles[i] ,并从中 移除 floor(piles[i] / 2) 颗石子。 注意:你可以对 同一堆 石子多次执行此操作。
  • 返回执行 k 次操作后,剩下石子的 最小 总数。floor(x) 为 小于 或 等于 x 的 最大 整数。(即,对 x 向下取整)。

思路:每次选择列表中最大元素进行移除

实现1:每次对最大的元素移除并更新后,重新对列表进行排序。

class Solution:
    import heapq
    def minStoneSum(self, piles: List[int], k: int) -> int:
        piles.sort()
        for i in range(k):
            piles[-1]-=int(piles[-1]/2)
            piles.sort()
        return sum(piles)

对时间复杂度进行分析:sort()方法的时间复杂度为O(NlogN),因此总的时间复杂度为KO(NlogN),会出现时间超时。

实现2:建立最大堆,每次只对第一个元素操作,并进行堆的弹出和插入。

class Solution(object):
    import heapq
    def minStoneSum(self, piles, k):
        total=sum(piles)
        piles=[-i for i in piles]
        heapq.heapify(piles)
        for i in range(k):
            max_value=-piles[0]
            total-=int(max_value/2)
            push_data=max_value-int(max_value/2)
            heapq.heappop(piles)
            heapq.heappush(piles,-push_data)
        return total
​
        """
        :type piles: List[int]
        :type k: int
        :rtype: int
        """

对时间复杂度进行分析:堆排序的插入时间复杂度为O(logN),因此总的时间复杂度为KO(logN),可以顺利通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果每隔两三加入一条消息,并且消费者无法及时处理这些消息,那么就会导致消息积。即使使用延迟交换也无法避免这种情况。因此,为了避免消息积,建议您在添加消息之前检查队列中的消息数量,并在需要时调整生产者的速率,以使得消费者有足够的时间处理消息,避免消息的过度积压。此外,您还可以通过增加消费者数量等方式来提高消息的处理速度,从而避免消息积的问题。 ### 回答2: 如果使用RabbitMQ的延迟交换,每隔两三加入一条消息,有可能引起积。延迟交换是一种特殊类型的交换器,它会在一定时间后将消息路由到指定的队列。当消息被发送到延迟交换时,它会被保存在交换和队列之间的缓冲区中,直到指定的延迟时间到达后才会被发送到目标队列。 如果每隔两三加入一条消息,并且设置了较长的延迟时间,例如数分钟或更长时间,那么在消息达到延迟时间之前,会有大量的消息在缓冲区中等待发送。这将导致积的现象,因为每个消息都需要在指定的延迟时间到达后才能被发送到目标队列。 积问题可能会对系统造成一些负面影响。首先,大量的积消息会增加系统的负载,导致系统资源紧张。其次,如果延迟时间设置过长,可能会造成消息过时,丢失或者无法及时处理。因此,在使用延迟交换时,需要根据实际情况合理设置延迟时间,避免积问题的发生。 ### 回答3: 使用RabbitMQ的延迟交换来保证每隔两三加入一条消息不会引起消息积。延迟交换是RabbitMQ的一个特性,它允许消息在经过一段时间后才被传递给队列。 在这种情况下,我们可以创建一个延迟队列和一个延迟交换。每次发送消息时,将此消息发送到延迟交换,并设置消息的延迟时间为两三。延迟交换会在指定的延迟时间后将消息传递到延迟队列。然后,消费者可以从延迟队列中获取消息并处理。 由于每隔两三只有一条消息进入延迟队列,消费者有足够的时间处理这些消息,因此不会导致消息积。 需要注意的是,延迟交换和延迟队列的配置需要正确设置延迟时间和消息传递的流程。此外,消费者的处理速度也需要足够快以避免积压。 总结起来,使用RabbitMQ的延迟交换来保证每隔两三加入一条消息不会引起消息积,前提是正确配置延迟时间并保证消费者的处理速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值