news 2026/5/13 6:45:09

LeetCode 1665.完成所有任务的最少初始能量:排序(贪心)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 1665.完成所有任务的最少初始能量:排序(贪心)

【LetMeFly】1665.完成所有任务的最少初始能量:排序(贪心)

力扣题目链接:https://leetcode.cn/problems/minimum-initial-energy-to-finish-tasks/

给你一个任务数组tasks,其中tasks[i] = [actuali, minimumi]

  • actuali是完成第i个任务需要耗费的实际能量。
  • minimumi是开始第i个任务前需要达到的最低能量。

比方说,如果任务为[10, 12]且你当前的能量为11,那么你不能开始这个任务。如果你当前的能量为13,你可以完成这个任务,且完成它后剩余能量为3

你可以按照任意顺序完成任务。

请你返回完成所有任务的最少初始能量。

示例 1:

输入:tasks = [[1,2],[2,4],[4,8]]输出:8解释:一开始有 8 能量,我们按照如下顺序完成任务: - 完成第 3 个任务,剩余能量为 8 - 4 = 4 。 - 完成第 2 个任务,剩余能量为 4 - 2 = 2 。 - 完成第 1 个任务,剩余能量为 2 - 1 = 1 。 注意到尽管我们有能量剩余,但是如果一开始只有 7 能量是不能完成所有任务的,因为我们无法开始第 3 个任务。

示例 2:

输入:tasks = [[1,3],[2,4],[10,11],[10,12],[8,9]]输出:32解释:一开始有 32 能量,我们按照如下顺序完成任务: - 完成第 1 个任务,剩余能量为 32 - 1 = 31 。 - 完成第 2 个任务,剩余能量为 31 - 2 = 29 。 - 完成第 3 个任务,剩余能量为 29 - 10 = 19 。 - 完成第 4 个任务,剩余能量为 19 - 10 = 9 。 - 完成第 5 个任务,剩余能量为 9 - 8 = 1 。

示例 3:

输入:tasks = [[1,7],[2,8],[3,9],[4,10],[5,11],[6,12]]输出:27解释:一开始有 27 能量,我们按照如下顺序完成任务: - 完成第 5 个任务,剩余能量为 27 - 5 = 22 。 - 完成第 2 个任务,剩余能量为 22 - 2 = 20 。 - 完成第 3 个任务,剩余能量为 20 - 3 = 17 。 - 完成第 1 个任务,剩余能量为 17 - 1 = 16 。 - 完成第 4 个任务,剩余能量为 16 - 4 = 12 。 - 完成第 6 个任务,剩余能量为 12 - 6 = 6 。

提示:

  • 1 <= tasks.length <= 105
  • 1 <= actual​i<= minimumi<= 104

解题方法:贪心

单看每个task的第一个数actual,不论task顺序如何,actual之和都是需要被满足然后消耗掉的。单看这个,总能量至少为actual之和。

现在每个还多了个minimum。minimum这东西,不是实际消耗的能量,但是是启动这个任务所拥有的最少初始能量。minimum可能比actual多,并且这多出来的部分并不会被消耗。

多出来的部分被浪费了吗?不一定。你也可以把这多出来的部分用到其他任务上去。例如两个任务[ [ 3 , 3 ] , [ 1 , 4 ] ] [[3, 3], [1, 4]][[3,3],[1,4]],第二个任务需要多出来3 33的能量,这3 33的能量正好全部用到第一个任务上,一点都不浪费。

也就是说,最佳策略是:优先完成多出来部分比较多的任务,然后把多出来的能量用到其他浪费更小的任务上去。

  • 时间复杂度O ( n log ⁡ n ) O(n\log n)O(nlogn),其中n = l e n ( t a s k s ) n=len(tasks)n=len(tasks)
  • 空间复杂度O ( log ⁡ n ) O(\log n)O(logn)

AC代码

C++
/* * @LastEditTime: 2026-05-12 16:36:57 */classSolution{public:intminimumEffort(vector<vector<int>>&tasks){sort(tasks.begin(),tasks.end(),[](constvector<int>&a,constvector<int>&b){returna[1]-a[0]>b[1]-b[0];});intans=0,now=0;for(vector<int>&task:tasks){if(now<task[1]){intneed=task[1]-now;now=task[1];ans+=need;}now-=task[0];}returnans;}};#ifdef_DEBUG/* [[1,2],[2,4],[4,8]] 8 */intmain(){string s;while(cin>>s){vector<vector<int>>v=stringToVectorVector(s);Solution sol;cout<<sol.minimumEffort(v)<<endl;}return0;}#endif

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

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 6:44:25

SoC硬件辅助验证技术解析与应用实践

1. SoC硬件辅助验证&#xff1a;应对复杂芯片设计的关键技术 在移动通信处理器领域&#xff0c;我曾参与过一个典型的多核SoC验证项目。当团队首次尝试在RTL仿真器上启动Android系统时&#xff0c;仿真速度仅为1.Hz——这意味着完成一次系统启动需要超过300天。这个令人绝望的数…

作者头像 李华
网站建设 2026/5/13 6:40:56

AI工作流编排框架:从脚本串联到声明式协同

1. 项目概述&#xff1a;当AI模型需要“交响乐团”指挥最近在开源社区里&#xff0c;我注意到一个挺有意思的项目&#xff0c;叫ruska-ai/orchestra。光看名字&#xff0c;“Orchestra”&#xff08;交响乐团&#xff09;就挺有画面感的。这让我立刻联想到&#xff0c;在当下这…

作者头像 李华
网站建设 2026/5/13 6:36:06

DLP Pico技术与近眼显示系统设计解析

1. DLP Pico技术解析&#xff1a;微镜阵列如何重塑显示未来 在2014年&#xff0c;德州仪器(TI)推出了一项颠覆性的显示技术——基于DLP TRP架构的Pico芯片组。这项技术的核心是一块布满微小铝镜的芯片&#xff0c;每个微镜尺寸仅5.4微米&#xff0c;比人类头发直径的十分之一还…

作者头像 李华
网站建设 2026/5/13 6:33:07

从泰鼎高管离职事件看半导体公司治理与技术战略平衡

1. 事件背景与核心脉络梳理2011年初&#xff0c;半导体行业发生了一起在当时颇具话题性的高层人事地震。主角是当时在数字电视和多媒体处理器领域颇有建树的泰鼎微系统&#xff08;Trident Microsystems, Inc.&#xff09;。事件的核心是&#xff0c;公司的首席执行官&#xff…

作者头像 李华
网站建设 2026/5/13 6:32:12

开会超时被踢?四款视频会议工具性价比实测

上周&#xff0c;小李的创业团队又扩员了。团队一直用的免费视频会议工具有单场时长限制&#xff0c;超时后主持人会被强制退出会议。现在团队扩大到8个人&#xff0c;如果升级到付费版&#xff0c;每人每月的费用接近百元。小李算了一下&#xff1a;一年下来&#xff0c;光会议…

作者头像 李华
网站建设 2026/5/13 6:25:14

5分钟Git指南

Git——一个版本控制系统 了解Git当你建立了一个Git版本库&#xff0c;那么存放.git&#xff08;也就是版本库&#xff09;的文件夹就被称为工作区&#xff0c;.git内部有一个暂存区&#xff0c;一个叫做master的分支&#xff0c;一个HEAD指针能够指向分支中不同版本的文件&…

作者头像 李华