力扣 1705. 吃苹果的最大数目

题目来源:https://leetcode-cn.com/problems/maximum-number-of-eaten-apples/

大致题意:
给一个苹果数组表示每天可以产出的苹果数量,再给一个保质期数组表示当天产出苹果的保质期。假设每天最多吃一个苹果,最多可以有多少天吃到苹果

思路

首先需要明了,最后一天的产出的苹果如果保质期够长,数量够多,哪怕接下来不产出苹果,之后的几天仍然可以吃最后一天多余的还能吃的苹果

如果想吃的天数够多,那么就需要尽可能先吃保质期短的,就是尽可能先吃快要过期的
显然就是贪心

于是可以用优先队列存下每天产出的苹果和对应的还能吃的截止日期,按照截止日期升序排序

贪心 + 优先队列
  1. 如果当前还能产出苹果,将苹果数量和对应的截止日期存入队列
  2. 从当前剩余的苹果中选出快要过期的吃

代码:

public int eatenApples(int[] apples, int[] days) {
        PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> a[1] - b[1]);
        int day = 0;    // 日期
        int n = apples.length;
        int ans = 0;    // 吃的苹果数量
        // 当还可以产出苹果或者还有能吃的苹果时继续循环
        while (day < n || !queue.isEmpty()) {
            // 如果还有新成熟的苹果,加入队列
            if (day < n) {
                // 腐烂的日期
                int rotDay = days[day] + day;
                int num = apples[day];
                queue.offer(new int[]{num, rotDay - 1});
            }
            // 把腐烂的苹果去掉
            while (!queue.isEmpty() && queue.peek()[1] < day) {
                queue.poll();
            }
            // 如果还有能吃的苹果
            if (!queue.isEmpty()) {
                int[] apple = queue.poll();
                // 如果这包苹果数量大于 1,那么吃完重新放入队列
                if (apple[0] > 1 && apple[1] > day) {
                    queue.offer(new int[]{apple[0] - 1, apple[1]});
                }
                // 只有当前苹果数量大于 0 时,才能吃
                if (apple[0] > 0) {
                    ans++;
                }
            }
            day++;
        }
        return ans;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值