【每日一题】全部开花的最早一天

news2024/11/29 9:56:34

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:贪心+排序
  • 写在最后

Tag

【贪心】【排序】【数组】【2023-09-30】


题目来源

2136. 全部开花的最早一天


题目解读

每一朵花需要先种下种子才会生长、开花。种种子需要花一些时间,生长也需要一些时间。每天只能种一颗种子,你可以连续几天都在种一颗种子也可以不连续种植。种子在生长的最后一天之后会一直开放。请计算所有种子都开花的最早一天。


解题思路

方法一:贪心+排序

参考 贪心及其证明(Python/Java/C++/Go/JS/Rust) 写的自己的理解。

需要交替播种吗?

播种很多的种子,总的播种时间是不会变的,等于所有种子的播种时间之和。对比播种完成一颗种子再去播种下一刻种子与交替播种种子这两种情况,交替播种种子会导致某些种子的播种完成时间延后,这对开花时间可能会造成延后的影响(没有好处),因此不考虑交替播种种子,应该播种玩一颗种子再去播种另一颗种子。

谁先播种?

我们先看局部最优的情况,即播种两颗种子不同播种顺序下的最早开花时间。

为了便于叙述,设两颗种子播放的所需天数为 p1p2,生长所需天数为 g1g2。不妨设 g1 >= g2,我们来计算一下不同播种顺序下的最晚开花时间:

  • 先播种种子 1 再播种种子 2:最晚开花时间为 max(p1 + g1, p1 + p2 + g2)
  • 先播种种子 2 再播种种子 1:最晚开花时间为 max(p1 + p2 + g1, p2 + g2)

接下来,比较一下以上两种播种顺序下的最晚开花时间。因为 g1 >= g2,且 p1 > 0,所以 max(p1 + p2 + g1, p2 + g2) = p1 + p2 + g1。因为 p1 + g1 < p1 + p2 + g1,且 p1 + p2 + g2 <= p1 + p2 + g1,所以 max(p1 + g1, p1 + p2 + g2) <= p1 + p2 + g1,于是有:max(p1 + g1, p1 + p2 + g2) <= max(p1 + p2 + g1, p2 + g2)

上式表明,按照 “先播种种子 1 再播种种子 2” 的顺序播种,最晚开花时间不会晚于 “先播种种子 2 再播种种子 1” 的播种顺序的最晚开花时间。

局部最优的方案是:让生长天数大的种子先播放。

以上局部最优的方案意味着 按照生长天数从大到小排序 后,交换任意两颗种子的播种顺序,不会让最晚开花时间提前。

接下来用反证法证明以上局部最优的方案是全局最优的。反证法只需要找出一个反例即可证明反证法假设不成立。

假设存在其它更优的种子排列,我们可以交换「生长天数小且排在前面的种子」与「生长天数大且排在后面的种子」,从而得到更早的最晚开花时间(这又是一个更优的种子播种方案了,与当前假设的最优方案不符),因此假设不成立,故 按照生长天数从大到小的顺序播种 也是全局最优的。

实现代码

class Solution {
public:
    int earliestFullBloom(vector<int>& plantTime, vector<int>& growTime) {
        int n = plantTime.size();
        vector<int> id(n);
        iota(id.begin(), id.end(), 0);
        sort(id.begin(), id.end(), [&](int i, int j) {
            return growTime[i] > growTime[j];
        });
        int res = 0, days = 0;
        for (auto i : id) {
            days += plantTime[i];
            res = max(res, days + growTime[i]);
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 是数组 plantTime 的长度。

空间复杂度: O ( n ) O(n) O(n),使用的额外变量为排序使用的辅助数组 id


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26973-2011 空气源热泵辅助的太阳能热水系统 储水箱容积大于0.6m3 技术规范

声明 本文是学习GB-T 26973-2011 空气源热泵辅助的太阳能热水系统 储水箱容积大于0.6m3 技术规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了空气源热泵辅助的太阳能热水系统的定义、符号和单位、组成与分类、设计要求、技术…

excel筛选后求和

需要对excel先筛选&#xff0c;后对“完成数量”进行求和。初始表格如下&#xff1a; 一、选中表内任意单元格&#xff0c;按ctrlshiftL&#xff0c;开启筛选 二、根据“部门”筛选&#xff0c;比如选择“一班” 筛选完毕后&#xff0c;选中上图单元格&#xff0c;然后按alt后&…

PyQt/PySide ImportError: DLL load failed while importing Shiboken,PyQt库和python

最近在测试PySide项目&#xff0c;在新环境下报错了&#xff1a;ImportError: DLL load failed while importing Shiboken: 找不到指定的程序。 Traceback (most recent call last):File "D:/xxx.py", line 10, in <module>from PySide6.QtWidgets import QAp…

excel中将一个sheet表根据条件分成多个sheet表

有如下excel表&#xff0c;要求&#xff1a;按月份将每月的情况放在一个sheet中。 目测有6个月&#xff0c;就应该有6个sheet&#xff0c;每个sheet中体现本月的情况。 一、首先增加一个辅助列&#xff0c;月份&#xff0c;使用month函数即可。 填充此列所有。然后复制【月份】…

基于微信小程序的网络安全科普题库答题系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

数据集笔记:旧金山共享单车OD数据

数据地址&#xff1a;System Data | Bay Wheels | Lyft

嵌入式学习笔记(38)什么是PWM

PWM&#xff08;pulse width modulation 脉宽调制&#xff09; (2)PWM波形是一个周期性波形&#xff0c;周期为T&#xff0c;在每个周期内波形是完全相同的。每个周期由一个高电平和低电平组成。 (3)PWM波形有2个重要参数&#xff1a;一个是周期T&#xff0c;另一个是占空比d…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 D: 合并数列

[蓝桥杯 2023 国 B] 合并数列 【问题描述】 小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案&#xff0c;分别将他们列为两个数组 { a 1 , a 2 , ⋯ a n } \{a_1, a_2, \cdots a_n\} {a1​,a2​,⋯an​} 和 { b 1 , b 2 , ⋯ b m } \{b…

springboot项目中定时任务注解@Scheduled未按cron表达式执行

springboot项目中定时任务注解Scheduled未按cron表达式执行 背景问题复现原因分析解决方法其他原因 背景 在将一个类注入到ioc后&#xff0c;其中定义了几个定时任务&#xff0c;分别是每隔十秒执行一次&#xff0c;但实际情况却是半小时才执行一次&#xff0c;故开始分析原因&…

【成功解决】ERROR: cuda failure (unknow error) in error_util.h:91

点击目录可跳转 起因原因解决办法 起因 安装cudnn时&#xff0c;想进行验证操作&#xff0c;进入官方提供的$HOME/cudnn_samples_v8/mnistCUDNN/后&#xff0c;运行./mnistCUDNN时&#xff0c;报了标题的错误。如下图&#xff1a; 顺便提一下&#xff0c;我是不知道为什么报错…

UE5屏幕适配

一、本程序设计发布在手机上&#xff0c;首先确定屏幕的设计分辨率&#xff0c;这里我们选择iphone6s&#xff0c;750x1334。 二、设置DPI Scale为1.0的比例&#xff0c;点击齿轮标志 因为我们这个程序是手机竖屏使用的&#xff0c;所以DPI Scale Rule选择Shortest Side&#…

容器网络概述

容器就是 Container&#xff0c;而 Container 的另一个意思是集装箱。其实容器的思想就是要变成软件交付的集装箱。集装箱的特点&#xff0c;一是打包&#xff0c;二是标准。 封闭的环境主要使用了两种技术&#xff0c;一种是看起来是隔离的技术&#xff0c;称为 namespace&am…

Pycharm中右键运行python程序时出现Run ‘pytest in XXX.py

新版本pycharm2022&#xff0c;调试程序的时候&#xff0c;无法进入__main__&#xff0c;最后发现是选择debug模式是pytest。 主要原因是有个函数名为test。 右键运行代码时和正常运行不一致&#xff0c;只执行单一函数test。右键菜单出现以下画面&#xff1a;“ Debug Pytho…

leetCode 279.完全平方数 动态规划 + 完全背包

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 示…

队列的实现——单链表

队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 那么我们应该用顺序变…

No156.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Spring Boot:利用JPA进行数据库的增改

目录 JPA介绍Service接口Service和Autowired示例代码 Dao数据库操作层Repository示例代码 控制器文件示例代码-增加增加成功示例代码-修改修改成功 JPA介绍 JPA&#xff08;Javaa Persistence API)一种用于持久化 Java 对象到关系型数据库的标准规范。它提供了一种统一的方式来…

LeetCode每日一题:2136. 全部开花的最早一天(2023.9.30 C++)

目录 2136. 全部开花的最早一天 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 2136. 全部开花的最早一天 题目描述&#xff1a; 你有 n 枚花的种子。每枚种子必须先种下&#xff0c;才能开始生长、开花。播种需要时间&#xff0c;种子的生…

基于Java实现的社区团购系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统功能具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域…

MySQL 通过存储过程高效插入100w条数据

目录 一、前言二、创建表三、编写存储过程插入数据四、高效插入数据方案4.1、插入数据时删除表中全部索引4.2、存储过程中使用统一事务插入&#xff08;性能显著提升&#xff09;4.3、调整MySQL系统配置&#xff08;性能显著提升&#xff0c;适合存储过程没有使用统一事务&…