仅以此纪录每日LeetCode所刷题目(我好菜啊,今天又又寄了,代码来自benhao大佬的最小堆贪心法)
题目描述:
示例:
思路:
今天刚看到这道题的时候我认为如果没有隔夜的苹果,则必须吃掉当天的苹果。于是写出了下面这段代码。
class Solution:
def eatenApples(self, apples: List[int], days: List[int]) -> int:
list1 = []
for i in range(len(apples)):
if apples[i] < days[i]:
list1.append(apples[i])
else:
list1.append(days[i])
count = 0
for i in range(len(list1)):
if i+list1[i] > count:
count += list1[i]
return count
然而...
根据我的思路,这个用例的输入所对应的输出一定是3。我们在第一、第二天吃掉第一天的苹果,之后在第三天吃掉第二天的苹果,当到第四天的时候,第三天的10个苹果都已经坏掉了。所以输出为3。但是如果我们想要得出吃掉苹果的最大数量,那么我们必须吃掉快要坏掉的苹果,要在第三天吃掉第三天的苹果,在第四天吃掉第二天的苹果,这样输出为4,更符合题意的要求。
代码:
class Solution:
def eatenApples(self, apples: List[int], days: List[int]) -> int:
pq, i, ans = [], 0, 0
while i < len(apples):
while pq and pq[0][0] <= i:
heapq.heappop(pq)
if apples[i]:
heapq.heappush(pq, [i + days[i], apples[i]])
if pq:
pq[0][1]-=1
if not pq[0][1]:
heapq.heappop(pq)
ans += 1
i += 1
while pq:
cur = heapq.heappop(pq)
d = min(cur[0] - i, cur[1])
i += d
ans += d
while pq and pq[0][0] <= i:
heapq.heappop(pq)
return ans