0
点赞
收藏
分享

微信扫一扫

[leetcode 2022-1-8] 一、吃苹果的最大数目

三维控件研究 2022-01-08 阅读 93

在这里插入图片描述


没有理解

为了将吃苹果的数目最大化,应该使用贪心策略,在尚未腐烂的苹果中优先选择腐烂日期最早的苹果。
可以使用优先队列存储每个苹果的腐烂日期,最早腐烂日期的最先被取出。

可以在优先队列中存储二元组,每个二元组表示苹果的腐烂日期和在该日期腐烂的苹果个数

计算吃苹果的最大数目分成两个阶段,第一阶段是第 0 天到第 n - 1 天,即天数在数组下标范围内,第二阶段是第 n天及以后,即天数在数组下标范围外。
假设当前日期是第 i天,首先将优先队列中的所有腐烂日期小于等于 i的元素取出过期了,队列不为空,则可以吃到苹果,假设优先队列的队首元素的腐烂日期是 x,数量是 y,其中 x>i,则有 y 个苹果,距离腐烂还有 x−i 天

因此能吃到的苹果数量是 curr=min(x−i,y)
将队首取出,将 i+curr
重复操作直至队首为空

第二阶段比较简单
理解了

class Solution:
    def eatenApples(self, apples: List[int], days: List[int]) -> int:
        # 第i天,树上会有i个苹果   day[i]  表示几天后腐烂(包含当天)
        ans = 0
        pq = []
        i = 0
        while i < len(apples):

            while pq and pq[0][0] <= i:
                heappop(pq)
            if apples[i]:
                heappush(pq, [i + days[i], apples[i]])
            if pq:
                pq[0][1] -= 1
                if pq[0][1] == 0:
                    heappop(pq)
                ans += 1
            i += 1
        while pq:
            while pq and pq[0][0] <= i:
                heappop(pq)
            if len(pq) == 0:
                break
            p = heappop(pq)
            num = min(p[0] - i, p[1])
            ans += num
            i += num
        return ans
举报

相关推荐

0 条评论