来源:力扣(LeetCode)
链接:https://leetcode-cn.com/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 ,返回你可以吃掉的苹果的最大数目。

示例 1:

输入:apples = [1,2,3,5,2], days = [3,2,1,4,2]
输出:7
解释:你可以吃掉 7 个苹果:
- 第一天,你吃掉第一天长出来的苹果。
- 第二天,你吃掉一个第二天长出来的苹果。
- 第三天,你吃掉一个第二天长出来的苹果。过了这一天,第三天长出来的苹果就已经腐烂了。
- 第四天到第七天,你吃的都是第四天长出来的苹果。

示例 2:

输入:apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2]
输出:5
解释:你可以吃掉 5 个苹果:
- 第一天到第三天,你吃的都是第一天长出来的苹果。
- 第四天和第五天不吃苹果。
- 第六天和第七天,你吃的都是第六天长出来的苹果。

提示:

apples.length == n
days.length == n
1 <= n <= 2 * 104
0 <= apples[i], days[i] <= 2 * 104
只有在 apples[i] = 0 时,days[i] = 0 才成立

解题思路

本题使用贪心算法进行模拟求解,每次找到最快腐烂的苹果吃掉,并且扔掉已经腐烂的苹果,便可以使得吃的苹果数目最多(虽然可能永远吃不到新鲜苹果)

如果每一天都进行一次查找,时间复杂度会非常高,所以采用优先队列的方式,永远将快腐烂的苹果放在堆顶。

想法1.0:

首先将每天产生的苹果数量的腐烂日期一个一个的存入优先队列,然后寻找队列中腐烂的苹果扔掉,最后取堆顶的苹果吃掉,直到队列为空的那天为止。

由于一天可能产生的苹果数量也非常多,所以时间复杂度依然很高,不能将苹果一个一个存入优先队列。

想法2.0:

利用一个类来记录腐烂时间和数量,将产生的苹果打包直接全部放入优先队列中,然后寻找优先队列中已经腐烂的苹果包或者苹果包中没有苹果的苹果包丢掉,取出腐烂日期最近的苹果包吃一个再放入。直到队列中没有苹果包为止。

代码展示

  1. class Solution {
  2. public:
  3. class Item
  4. {
  5. public:
  6. int miDay;
  7. int miCount;
  8. Item(int iDay, int iCount)
  9. {
  10. this->miDay = iDay;
  11. this->miCount = iCount;
  12. }
  13. bool operator<(const Item& other) const
  14. {
  15. return this->miDay > other.miDay;
  16. }
  17. };
  18.  
  19. int eatenApples(vector<int>& apples, vector<int>& days) {
  20.  
  21. priority_queue<Item> pqiQueue;
  22. int iDay = 0, iRet = 0;
  23. while(iDay < apples.size() || !pqiQueue.empty())
  24. {
  25. if(iDay < apples.size())
  26. {
  27. pqiQueue.push(Item (iDay + days[iDay], apples[iDay]));
  28. }
  29. while(!pqiQueue.empty() && (pqiQueue.top().miDay <= iDay || pqiQueue.top().miCount < 1))
  30. {
  31. pqiQueue.pop();
  32. }
  33. if(!pqiQueue.empty())
  34. {
  35. Item zTemp = pqiQueue.top();
  36. pqiQueue.pop();
  37. zTemp.miCount--;
  38. if(zTemp.miCount > 0)
  39. {
  40. pqiQueue.push(zTemp);
  41. }
  42. iRet++;
  43. }
  44. iDay++;
  45. }
  46. return iRet;
  47.  
  48. }
  49. };

运行结果

LeetCode-1705 吃苹果的最大数目的更多相关文章

  1. P1676陶陶吃苹果 - vijos

    描述 curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上有c[i]个苹果, ...

  2. [Vijos 1676] 陶陶吃苹果

    Description curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上 ...

  3. C# 多线程经典示例 吃苹果

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈 ...

  4. Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)

    下面通过一个样例演示如何实现飞行道具的生成,以及道具碰撞拾取. 样例说明: 1,屏幕从右到左不断地生成苹果飞过来(苹果高度随机) 2,点击屏幕可以让熊猫跳跃 3,熊猫碰到苹果,苹果消失 运行效果: 样 ...

  5. [LeetCode]1512. 好数对的数目

    给你一个整数数组 nums . 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 . 返回好数对的数目. 示例 1: 输入:nu ...

  6. LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands

    地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 gri ...

  7. Leetcode 1254. 统计封闭岛屿的数目

    题目: 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座 ...

  8. leetcode 1301. 最大得分的路径数目

    地址 https://leetcode-cn.com/problems/number-of-paths-with-max-score/ 给你一个正方形字符数组 board ,你从数组最右下方的字符 ' ...

  9. 【LeetCode】999. Available Captures for Rook 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 四方向搜索 日期 题目地址:https://leetc ...

  10. [置顶] 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

随机推荐

  1. vscode下无法使用fresh的问题

    使用了go get github.com/pilu/fresh ,需要 go install github.com/pilu/fresh. 在带用go.mod的版本中,go get只是下载代码和帮助修 ...

  2. CH579-Lwip-2.12移植

    代码可以参考以下链接:https://gitee.com/maji19971221/lwip-routine Lwip可以在以下链接下载:http://download.savannah.gnu.or ...

  3. [深度学习] tf.keras入门3-回归

    目录 波士顿房价数据集 数据集 数据归一化 模型训练和预测 模型建立和训练 模型预测 总结 回归主要基于波士顿房价数据库进行建模,官方文档地址为:https://tensorflow.google.c ...

  4. [Java]内存回收机制框架图

    具体解释下面这篇博客总结的已经非常好了,我就不复制了: http://www.cnblogs.com/cielosun/p/6674431.html#12-%E5%8F%AF%E8%BE%BE%E6% ...

  5. [LeetCode]数组拆分 I

    题目 代码 class Solution { public: int arrayPairSum(vector<int>& nums) { std::sort(nums.begin( ...

  6. [Unity]限制一个值的大小(Clamp以及Mathf)

    如何限制一个物体的运动范围? 代码实例 public float xMin, xMax, zMin, zMax; rigidbody.position = new Vector3( Mathf.Cla ...

  7. ac自动姬

    字符串 ac自动姬 前言 省选临近,不能再颓了! 说着开始研究起moonlight串流.真香 本期博客之所以在csdn上发了一份,因为没有图床!如果有图床我一定会自力更生的! 好像和字符串没有毛关系 ...

  8. 在GCP上创建GCE的三种方式(Console,gcloud,Terraform)

    1 简介 如果要选择GCP为云平台,则经常需要创建GCE(Google Compute Engine),有以下几种方式: (1) 在浏览器创建 (2) 命令 gcloud (3) Terraform ...

  9. angular基础之单向绑定,双向绑定以及数据绑定失效的问题

    单向绑定 事件绑定: <input (keyup)="inputChange($event)" /> 属性绑定: <input [value]="inp ...

  10. Failed to find "GL/gl.h" in "/usr/include/libdrm"

    环境qt5.12.3 deepin15.10 使用cmake构建项目时报错,网上查询了一下发现时未安装opengl,于是安装便是了 sudo apt install mesa-common-dev 问 ...