当前位置: 首页 > news >正文

LeetCode 1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解

【LetMeFly】1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解

力扣题目链接:https://leetcode.cn/problems/maximum-number-of-eaten-apples/

有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0days[i] == 0 表示。

你打算每天 最多 吃一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。

给你两个长度为 n 的整数数组 daysapples ,返回你可以吃掉的苹果的最大数目

 

示例 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 才成立

解题方法:贪心

思路很简单:

有一些苹果,你先吃哪个?答案是先吃腐烂最早的。

因此可以使用优先队列,从第0天开始模拟到第 n − 1 n-1 n1天:

每天将当天新苹果入队;腐烂较早的最优先;

队列不空今天还没吃到苹果时不断出队,若已腐烂则丢弃,若未腐烂则吃一个并将剩下的苹果入队。

遍历完 0 0 0 n − 1 n-1 n1天,不再有新苹果了,但队列中可能有旧苹果。

这次和之前有所不同,不再一天一天吃,而是几天几天连续算:

假设当前是第 d a y day day天,队首苹果有 a p p l e N u m appleNum appleNum个且将在 r o t D a y rotDay rotDay腐烂,则能连续吃 m a x ( 0 , m i n ( r o t D a y − d a y , a p p l e N u m ) ) max(0, min(rotDay - day, appleNum)) max(0,min(rotDayday,appleNum))天。

为什么 0 0 0 n − 1 n-1 n1天要一天一天地吃,而从第 n n n天开始可以连续吃同一批苹果?

因为从第 n n n天开始不会产生新苹果了,我们不再关心苹果的“产生日期”,只要没过保质期就能吃。

但是前 n n n天可不一样,例如第 0 0 0天产 2 2 2 1000 1000 1000天保质期的苹果,第 1 1 1天产 1 1 1个保质期 1 1 1天的苹果,那么就不能照着第 0 0 0天的 2 2 2个连续吃完,而应该第 0 0 0 3 3 3天吃第 0 0 0天产的,第 1 1 1天吃第 1 1 1天产的。

本质上来说就是前 n n n天每天都有新苹果产生,可能导致队首苹果不再是腐烂最早的苹果。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++
/** @Author: LetMeFly* @Date: 2024-12-24 10:56:16* @LastEditors: LetMeFly.xyz* @LastEditTime: 2024-12-24 18:41:09*/
// 不能只按照腐烂截止时间
// 例如不能为了吃截止时间为6的4,5而空出第3天
/*
[1,2,3,5,2]
[3,2,1,4,2]<0-3, 1>, <1-3, 2>, <2-3, 1>, <3-7, 5>, <4-6, 2>0        1, 2                3, 6     4, 5
*/
// 前n天应该 边遍历边入队
class Solution {
public:int eatenApples(vector<int>& apples, vector<int>& days) {priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;int ans = 0, day = 0;for (; day < apples.size(); day++) {if (apples[day]) {pq.push({day + days[day], apples[day]});}while (pq.size()) {auto [rotDay, appleNum] = pq.top();pq.pop();if (rotDay <= day) {continue;}ans++;appleNum--;if (appleNum) {pq.push({rotDay, appleNum});}break;}}while (pq.size()) {auto [rotDay, appleNum] = pq.top();pq.pop();int eat = max(0, min(rotDay - day, appleNum));ans += eat;day += eat;}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2024-12-24 18:46:52
LastEditors: LetMeFly.xyz
LastEditTime: 2024-12-24 18:56:55
'''
from typing import List
import heapqclass Solution:def eatenApples(self, apples: List[int], days: List[int]) -> int:pq = []ans = 0for day in range(len(apples)):if apples[day]:heapq.heappush(pq, (day + days[day], apples[day]))while pq:rotDay, appleNum = heapq.heappop(pq)if rotDay <= day:continueans += 1appleNum -= 1if appleNum:heapq.heappush(pq, (rotDay, appleNum))breakday += 1  # 注意这里和C不一样,python执行完day是能取到的右值while pq:rotDay, appleNum = heapq.heappop(pq)eat = max(0, min(rotDay - day, appleNum))ans += eatday += eatreturn ans
Java
/** @Author: LetMeFly* @Date: 2024-12-24 18:58:06* @LastEditors: LetMeFly.xyz* @LastEditTime: 2024-12-24 19:07:07*/
import java.util.PriorityQueue;class Solution {public int eatenApples(int[] apples, int[] days) {PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a, b) -> a[0] - b[0]);int ans = 0, day = 0;for (; day < apples.length; day++) {if (apples[day] > 0) {pq.add(new int[]{day + days[day], apples[day]});}while (pq.size() > 0) {int[] temp = pq.poll();int rotDay = temp[0], appleNum = temp[1];if (rotDay <= day) {continue;}ans++;appleNum--;if (appleNum > 0) {pq.add(new int[]{rotDay, appleNum});}break;}}while (!pq.isEmpty()) {int[] temp = pq.poll();int rotDay = temp[0], appleNum = temp[1];int eat = Math.max(0, Math.min(rotDay - day, appleNum));ans += eat;day += eat;}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2024-12-24 19:07:32* @LastEditors: LetMeFly.xyz* @LastEditTime: 2024-12-24 23:43:52*/
package main
import "container/heap"type pair struct{ rotDay, appleNum int}
type PQ []pairfunc (pq PQ) Len() int           { return len(pq) }
func (pq PQ) Less(i, j int) bool { return pq[i].rotDay < pq[j].rotDay }
func (pq PQ) Swap(i, j int)      { pq[i], pq[j] = pq[j], pq[i] }
func (pq *PQ) Push(v any)        { *pq = append(*pq, v.(pair)) }
func (pq *PQ) Pop() any          { v := (*pq)[len(*pq) - 1]; *pq = (*pq)[:len(*pq) - 1]; return v }func min_eatenApples(a, b int) int { if a < b { return a}; return b}
func max_eatenApples(a, b int) int { if a > b { return a}; return b}func eatenApples(apples []int, days []int) (ans int) {var pq PQfor day := range apples {if apples[day] > 0 {heap.Push(&pq, pair{day + days[day], apples[day]})}for len(pq) > 0 {v := heap.Pop(&pq).(pair)rotDay, appleNum := v.rotDay, v.appleNumif rotDay <= day {continue}ans++appleNum--if appleNum > 0 {heap.Push(&pq, pair{rotDay, appleNum})}break}}day := len(apples)for len(pq) > 0 {v := heap.Pop(&pq).(pair)rotDay, appleNum := v.rotDay, v.appleNumeat := max_eatenApples(0, min_eatenApples(rotDay - day, appleNum))ans += eatday += eat}return
}

Golang的堆是一个接口,需要实现Len、Less、Swap、Push、Pop方法。

可参考与ChatGPT的对话

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/144705583

相关文章:

LeetCode 1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解

【LetMeFly】1705.吃苹果的最大数目&#xff1a;贪心(优先队列) - 清晰题解 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-number-of-eaten-apples/ 有一棵特殊的苹果树&#xff0c;一连 n 天&#xff0c;每天都可以长出若干个苹果。在第 i 天&#xff0c;…...

vim多窗格

vim打开文件分为三个阶段&#xff1a;buffer、window与tab buffer就是在同一个界面打开的文件window就是使用水平分割与垂直分割的窗口tab则是可以是上述两者的总集合 buffer :e filename在已打开文件的界面中再打开一个新文件&#xff0c;显示这个新文件&#xff0c;原文件被隐…...

ubuntu paddle ocr 部署bug问题解决

ubuntu paddle ocr 部署会出现异常报错。 尝试安装以下版本&#xff1a; pip install paddlepaddle2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simpl ​​​​​​ 助力快速掌握数据集的信息和使用方式。 数据可以如此美好&#xff01;...

OpenFeign快速入门 示例:黑马商城

使用起因 之前我们利用了Nacos实现了服务的治理,利用RestTemplate实现了服务的远程调用。这样一来购物车虽然通过远程调用实现了调用商品服务的方法,但是远程调用的代码太复杂了: 解决方法 并且这种调用方式比较复杂&#xff0c;一会儿远程调用&#xff0c;一会儿本地调用。 因…...

【C++】ceil 和 floor 函数的实现与分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;ceil 和 floor 函数的基础介绍1. ceil 函数定义与功能示例代码输出结果功能分析使用场景 2. floor 函数定义与功能示例代码输出结果功能分析使用场景 &#x1f4af;自行实现…...

zabbix监控山石系列Hillstone配置模版(适用于zabbix6及以上)

监控项&#xff1a; 触发器&#xff1a; 监控数据&#xff1a;...

在瑞芯微RK3588平台上使用RKNN部署YOLOv8Pose模型的C++实战指南

在人工智能和计算机视觉领域,人体姿态估计是一项极具挑战性的任务,它对于理解人类行为、增强人机交互等方面具有重要意义。YOLOv8Pose作为YOLO系列中的新成员,以其高效和准确性在人体姿态估计任务中脱颖而出。本文将详细介绍如何在瑞芯微RK3588平台上,使用RKNN(Rockchip N…...

CTFHub disable_functions通关

LD_PRELOAD 来到首页发现有一句话直接就可以用蚁剑连接 根目录里有/flag但是不能看;命令也被ban了就需要绕过了 绕过工具在插件市场就可以下载 如果进不去的话 项目地址: #本地仓库;插件存放 antSword\antData\plugins 绕过选择 上传后我们点进去可以看到多了一个绕过的文件;…...

Chromium GN 目标指南 - view_example 计数器示例 (七)

1. 引言 在前面的文章中&#xff0c;我们学习了如何在 views_examples 中添加自定义 Button 示例。在本篇文章中&#xff0c;我们将继续探索 Views 框架的应用&#xff0c;创建一个简单的计数器示例&#xff0c;以学习如何使用 Label 和 Button 控件进行交互&#xff0c;以及如…...

一步一步写线程之十六线程的安全退出之二例程

一、说明 在一篇分析了多线程的安全退出的相关机制和方式&#xff0c;那么本篇就针对前一篇的相关的分析进行举例分析。因为有些方法实现的方法类似&#xff0c;可能就不一一重复列举了&#xff0c;相关的例程主要以在Linux上的运行为主。 二、实例 线程间的同步&#xff0c…...

【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

ArcGIS+MIKE21 洪水淹没分析、溃坝分析,洪水淹没动态效果

洪水淹没分析过程&#xff1a; 一、所需数据&#xff1a; 1.分析区域DEM数据 二、ArcGIS软件 1.提取分析区域DEM&#xff08;水库坝下区域&#xff09; 2.DEM栅格转点 3.计算转换后几何点的x和y坐标值&#xff08;精度20、小数位3&#xff09; 4.导出属性表&#xff0c;形式…...

Git 的基本概念和使用

Git是一个分布式版本控制系统&#xff0c;它可以帮助开发人员追踪和管理代码的修改。下面是Git的基本概念和使用方式的解释&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git使用仓库来存储代码和版本历史记录。仓库可以位于本地计算机上&#xff0c;也可以…...

*【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数 好数 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一…...

对中文汉字排序的方法总结

写在前面 在各个系统中&#xff0c;都随处可见根据某个字段进行升序(ASC)或降序(DESC)进行排序展示。但进行中文汉字排序和查找的时候&#xff0c;对中文汉字的排序和查找结果往往都是错误的。 为了尽量提供全面的解决方法&#xff0c;本文会从各个层面出发告知有需要的人对应…...

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时&#xff0c;遇到如下报错&#xff1a; 报错原因&#xff1a; 正则表达式的 search 或 finditer 方法没有找到任何匹配项&#xff0c;可能是换行符处理不当等。 解决方法如下&#xff1a; 在正则表达式末尾加上re.S即可&#xff0c;re.S是一个编译标志&#xff0c…...

数据结构经典算法总复习(上卷)

第一章&#xff1a;数据结构导论 无重要考点&#xff0c;仅需了解时间复杂度。 第二章&#xff1a;线性表 1.获得线性表第i个元素 void GetElem_sq(SqList L, int i, ElemType &e) {if (i<1 || i>L.length) ErrorMsg("Invalid i value"); //注意错误监…...

JS获取URL中参数值的4种方法

方法1&#xff1a;现代浏览器都支持 URL 和 URLSearchParams 对象&#xff0c;可以很方便地从URL中提取参数 // 假设当前URL为 "https://example.com/?nameJohn&age30" const url new URL(window.location.href); // 或者你可以直接传入一个URL字符串 const …...

【面经】2024年软件测试面试题,精选100 道(附答案)

测试技术面试题 1、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 2、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用…...

LabVIEW水泵性能测试系统

在现代工业应用中&#xff0c;水泵作为一种广泛使用的流体输送设备&#xff0c;其性能的可靠性对整个生产系统的稳定运行至关重要。通过LabVIEW软件配合专业硬件设备&#xff0c;设计了一套水泵性能测试系统&#xff0c;实现对各类水泵的综合性能测试与分析&#xff0c;提升水泵…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...