区间选点问题,LeetCode 2589. 完成所有任务的最少时间

一、题目

1、题目描述

你有一台电脑,它可以 同时 运行无数个任务。给你一个二维整数数组 tasks ,其中 tasks[i] = [starti, endi, durationi] 表示第 i 个任务需要在 闭区间 时间段 [starti, endi] 内运行 durationi 个整数时间点(但不需要连续)。

当电脑需要运行任务时,你可以打开电脑,如果空闲时,你可以将电脑关闭。

请你返回完成所有任务的情况下,电脑最少需要运行多少秒。

2、接口描述

python3
class Solution:def findMinimumTime(self, tasks: List[List[int]]) -> int:
cpp
class Solution {
public:int findMinimumTime(vector<vector<int>>& tasks) {}
};

3、原题链接

2589. 完成所有任务的最少时间


二、解题报告

1、思路分析

贪心问题中的经典问题——区间选点问题

区间选点问题在基础算法,贪心算法,贪心策略,OJ练习-CSDN博客中有介绍

其实就是若干区间[l, r],每个区间都有一个权值

我们要在数轴上选一些点使得每个区间内的点的数目都不得少于其权值

问我们最少要选多少点?

朴素O(nlogn + nU)做法:按照区间右端点升序排序,然后每个区间贪心的从右往左选点

这个做法对于每个区间都要遍历一遍,考虑区间操作可以用线段树优化我们可以优化到O(nlogn + nlogU)

栈上二分可以进一步优化到O(nlogn):

仍然是区间按右端点升序

我们选的点构成了若干不相交区间,我们在栈上按照左端点升序保存区间左端点,区间长度,区间长度前缀和

每次遍历到的区间[l, r, len]先在栈上二分第一个左端点大于等于 l 的区间[L, R]

先减去左边区间的贡献,再计算[L, R]对[l, r]的贡献

然后剩下的部分优先从r往左边放不断和栈顶的区间合并即可

其实和朴素做法是一样的,无论是线段树优化还是栈上二分都是优化了区间操作罢了

线段树太长了下面不写了

2、复杂度

时间复杂度: F1:O(nlogn + nU) F2:O(nlogn)空间复杂度:O(n)

3、代码详解

F1 

python3

class Solution:def findMinimumTime(self, tasks: List[List[int]]) -> int:vis = [0] * 2001for l, r, sz in sorted(tasks, key=lambda x: x[1]):sz -= sum(vis[l:r+1:])if sz > 0:for i in range(r, l - 1, -1):if not vis[i]:vis[i] = 1sz -= 1if not sz:breakreturn sum(vis)

cpp

class Solution {
public:int findMinimumTime(vector<vector<int>>& tasks) {vector<bool> vis(2001);sort(tasks.begin(), tasks.end(), [](const vector<int>& x, const vector<int>& y){return x[1] < y[1];});for(auto& t : tasks) {int l = t[0], r = t[1], len = t[2];len -= accumulate(vis.begin() + l, vis.begin() + r + 1, 0);if (len > 0)for(; len; r --)if (!vis[r])len -= (vis[r] = 1);}return accumulate(vis.begin(), vis.end(), 0);}
};
F2

python3

class Solution:def findMinimumTime(self, tasks: List[List[int]]) -> int:st = [(-1, -1, 0)]for l, r, sz in sorted(tasks, key=lambda x: x[1]):_, R, s = st[bisect_left(st, (l,)) - 1]sz -= st[-1][2] - sif l <= R:sz -= R - l + 1if sz <= 0:continuewhile r - st[-1][1] <= sz:L, R, _ = st.pop()sz += R - L + 1st.append((r - sz + 1, r, st[-1][2] + sz))return st[-1][2]

cpp

class Solution {
public:int findMinimumTime(vector<vector<int>>& tasks) {int n = tasks.size();vector<array<int, 3>> st;st.reserve(n);st.push_back({-1, -1, 0});sort(tasks.begin(), tasks.end(), [](const vector<int>& x, const vector<int>& y){return x[1] < y[1];});for (auto& p : tasks) {int l = p[0], r = p[1], len = p[2];auto [L, R, s] = *-- lower_bound(st.begin(), st.end(), l, [](const auto& a, int x){return a[0] < x;});len -= st.back()[2] - s;if (l <= R) len -= R - l + 1;if (len <= 0) continue;while (r - st.back()[1] <= len) {auto [L, R, _] = st.back();st.pop_back();len += R - L + 1;}st.push_back({r - len + 1, r, st.back()[2] + len});}return st.back()[2];}
};

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

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

相关文章

python文件操作常用方法(读写txt、xlsx、CSV、和json文件)

引言 用代码做分析的时候经常需要保存中间成果&#xff0c;保存文件格式各不相同&#xff0c;在这里好好总结一下关于python文件操作的方法和注意事项 Python 提供了丰富的文件操作功能&#xff0c;允许我们创建、读取、更新和删除文件。允许程序与外部世界进行交互。 文章目录…

【C++】从零开始构建二叉搜索树

送给大家一句话&#xff1a; 我们始终有选择的自由。选错了&#xff0c;只要真诚的反思&#xff0c;真诚面对&#xff0c;也随时有机会修正错误和选择。 – 《奇迹男孩(电影)》 &#x1f4bb;&#x1f4bb;&#x1f4bb;&#x1f4bb;&#x1f4bb;&#x1f4bb;&#x1f4bb;…

【echarts】解决ECharts鼠标悬停(mouseover)事件触发范围问题

解决ECharts鼠标悬停&#xff08;mouseover&#xff09;事件触发范围问题 在使用ECharts进行数据可视化时&#xff0c;经常会遇到一个问题&#xff1a;某些图表的鼠标悬停&#xff08;mouseover&#xff09;响应区域太小&#xff0c;导致用户交互体验不佳。本文将介绍如何调整…

C++之重载

1. 普通函数重载 要至少有一个不一样的&#xff0c;以便区分 2. 构造函数重载 要至少有一个不一样的&#xff0c;以便区分 (因为根据我们参数的不同或者类型的不同&#xff0c;我们来调用不同的构造函数)普通同理 3. 虚函数重载 在派生类中重载的虚函数要求函数名&#x…

数据资源入表难在哪?今晚带你一一弄懂(文末有福利)

​本周&#xff0c;我们即将开启数据要素系列直播《星光对话》的第四期&#xff0c;将由讲师-星光数智首席数据架构师 魏战松&#xff0c;于今晚19:00带来《数据资源入表和运营路径》的主题分享。 精彩内容提前知&#xff1a; 1、入表流程及各阶段参与方 2、入表难点和注意事项…

Android中使用Palette让你的页面UI优雅起来

文章目录 1. 什么是Palette2. 引入Palette3. 使用 Palette3.1 同步方式3.2 异步方式3.3 获取色调值 4. 举例4.1 布局文件 activity_palette_list.xml ⬇️4.2 Activity&#xff1a;PaletteListActivity⬇️4.3 列表Adapter&#xff1a;PaletteListAdapter ⬇️4.4 列表item布局…

「Python绘图」绘制同心圆

python 绘制同心圆 一、预期结果 二、核心代码 import turtle print("开始绘制同心圆") # 创建Turtle对象 pen turtle.Turtle() pen.shape("turtle") # 移动画笔到居中位置 pen.pensize(2) #设置外花边的大小 # 设置填充颜色 pen.fillcolor("green&…

java 并发线程应用

java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…

ThreadLocal描述

ThreadLocal是Java中的一个类&#xff0c;用于在多线程环境下存储和获取线程相关的数据。每个ThreadLocal对象都可以维护一个线程本地的变量副本&#xff0c;这意味着每个线程都可以独立地改变自己的副本&#xff0c;而不会影响其他线程的副本。这种特性使得ThreadLocal非常适合…

【C++算法】堆相关经典算法题

1.最后一块石头的重量 其实就是一个模拟的过程&#xff1a;每次从石堆中拿出最大的元素以及次大的元素&#xff0c;然后将它们粉碎&#xff1b;如果还有剩余&#xff0c;就将剩余的石头继续放在原始的石堆里面重复上面的操作&#xff0c;直到石堆里面只剩下一个元素&#xff0c…

[C/C++] -- 装饰器模式

装饰器模式是一种结构型设计模式&#xff0c;它允许在不改变原始对象的基础上动态地扩展其功能。这种模式通过将对象包装在装饰器类的对象中来实现&#xff0c;每个装饰器对象都包含一个原始对象&#xff0c;并可以在调用原始对象的方法之前或之后执行一些额外的操作。 装饰器…

自学C语言能达到什么境界呢?

C 语言是一门广泛应用于系统软件、嵌入式系统、游戏开发等领域的编程语言。那么&#xff0c;通过自学 C 语言&#xff0c;能够达到什么样的境界呢&#xff1f; 就像学习小提琴一样&#xff0c;仅凭自学也可以达到一定的水平&#xff0c;能够自娱自乐&#xff0c;在亲友聚会时表…

java命令启动进程logback无日志

排查公司一个通过java命令启动的进程打不出logback日志的问题&#xff0c;记录一下排查过程。 原因&#xff1a; 通过java -classpath A.jar:B.jar:C.jar启动时&#xff08;工程本身和依赖的jar都在classpath中&#xff09;&#xff0c;会从classpath中 【顺序 】 获取logbac…

Xed编辑器开发第一期:使用Rust从0到1写一个文本编辑器

这是一个使用Rust实现的轻量化文本编辑器。学过Rust的都知道&#xff0c;Rust 从入门到实践中间还隔着好几个Go语言的难度&#xff0c;因此&#xff0c;如果你也正在学习Rust,那么恭喜你&#xff0c;这个项目被你捡到了。本项目内容较多&#xff0c;大概会分三期左右陆续发布&a…

NAS导航面板Sun-Panel

什么是 Sun-Panel &#xff1f; Sun-Panel 是一个服务器、NAS 导航面板、Homepage、浏览器首页。 软件主要特点&#xff1a; &#x1f349; 界面简洁&#xff0c;功能强大&#xff0c;资源消耗低&#x1f34a; 简单易用&#xff0c;可视化操作&#xff0c;零代码使用&#x1f…

python怎么安装matplotlib

1、登陆官方网址“https://pypi.org/project/matplotlib/#description”&#xff0c;下载安装包。 2、选择合适的安装包&#xff0c;下载下来。 3、将安装包放置到python交互命令窗口的当前目录下。 4、打开windows的命令行窗口&#xff0c;通过"pip install"这个命令…

cgicc开发 (结合sqlite3操作数据库)

#include <iostream> #include <fstream> //读写文件 c标准库 #include <string> //字符串类 c标准库 #include <sstream> //字符串流 c标准库 #include <assert.h> #include "sqlite3.h" //sqlite3头文件#include <cgicc/CgiDefs.…

新质生产力之工业互联网产业链

随着全球经济的数字化转型&#xff0c;新基建的概念逐渐成为推动工业发展的关键动力。在这一转型过程中&#xff0c;工业互联网作为新基建的核心组成部分&#xff0c;正逐渐塑造着未来工业的面貌。那么工业互联网产业链是如何构成的&#xff0c;以及它如何成为推动工业4.0和智能…

CRMEB开源打通版/标准版v4电商商城系统小程序发布之后无法生成海报问题

小程序产品分销二维码生成不了 开发者工具可以生成海报&#xff0c;但是发布之后无法生成 1.在开发者工具中&#xff0c;将不校验合法域名关闭 2.点击生成海报&#xff0c;查看console 3.将域名填写到微信公众平台小程序的download合法域名中 网址微信公众平台