算法题总结-吃苹果(有序处理)
原题
https://leetcode.cn/problems/maximum-number-of-eaten-apples/
有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。
你打算每天 最多 吃一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。
给你两个长度为 n 的整数数组 days 和 apples ,返回你可以吃掉的苹果的最大数目。
输入示例
apples = [1,2,3,5,2], days = [3,2,1,4,2]
输出示例
7
解释:
- 第一天,你吃掉第一天长出来的苹果。
- 第二天,你吃掉一个第二天长出来的苹果。
- 第三天,你吃掉一个第二天长出来的苹果。过了这一天,第三天长出来的苹果就已经腐烂了。
- 第四天到第七天,你吃的都是第四天长出来的苹果。
解析:
1、整个过程可以划分为前n天与后续两个阶段
2、前n天,每天分为拿苹果和吃苹果
3、后续,仅包含吃苹果
4、苹果分为过期与吃两种消耗手段
因此,整个阶段中,将每天收的苹果单独放一个框(数组),袋子里面若干个框(n天每天都有收的话,一个袋子就是n个框),每天取过期时间最短的苹果来吃即可
模拟过程
# 1.每天早上检查过期苹果
# 2.上午查看是否有苹果可以拿
# 3.中午取过期时间最短的框 框中取一个苹果 判断框里面是否还有苹果 没有就直接将框取出来
# 4、n天过后,每次直接计算过期时间最短的框里面的苹果能吃多久(一个框里面的苹果过期时间一致),遍历完所有框即可得到最终答案
注意事项:
# 每次取必须取过期时间最短的框
# 每次存必须进行过期时间排序
# 因此,不能直接自己实现,否则很容易超时,需要改用自带的堆排序
heappop(out)
heappush(out,[x1,x2,....,xn])#排序规则为 order by x1,x2,...,xn ASC
code:
class Solution:
def eatenApples(self, apples: List[int], days: List[int]) -> int:
length = len(apples)
# 基本解析
# 1.每天早上检查过期苹果
# 2.上午查看是否有苹果可以拿
# 3.中午取一个框 框中取一个苹果 判断框里面是否还有苹果 没有就直接将框取出来
out = []
count=0
for i in range(length):
while out and out[0][0]<=i:
heappop(out)
pass
if apples[i]>0:
heappush(out,[i+days[i],apples[i]])
if len(out)>0:
item = heappop(out)
item[1] = item[1]-1
count+=1
if item[1]>0:
heappush(out,item)
pass
pass
while out:
item = heappop(out)
minValue = min(item[0]-i-1,item[1])
i+=minValue
count+=minValue
pass
return count