LintCode 1897: Meeting Room III (扫描线法,累加数组)

(扫描线+差分思想)lintcode中等1897 · 会议室 3 扫描线+差分思想 阅读详情

1897. Meeting Room III

you have a list intervals of current meetings, and some meeting rooms with start and end timestamp.When a stream of new meeting ask coming in, check if it can be scheduled.A meeting room can only hold one meeting at a time. Each inquiry is independent.

 

Example

Example 1:

 

Input:

Intervals:[[1,2],[4,5],[8,10]], rooms = 1, ask: [[2,3],[3,4]]

Output: [true,true]

Explanation:

For the ask of [2,3], we can arrange a meeting room room0.

The following is the meeting list of room0:

[[1,2], [2,3], [4,5], [8,10]]

For the ask of [3,4], we can arrange a meeting room room0.

The following is the meeting list of room0:

[[1,2], [3,4], [4,5], [8,10]]

Example 2:

 

Input:

[[1,2],[4,5],[8,10]]

1

[[4,5],[5,6]]

Output:

[false,true]

Notice

Ensure that Intervals can be arranged in rooms meeting rooms

Ensure that the end time of any meeting is not greater than 50000

|Intervals|<=50000

|ask|<=50000

rooms<=20


解法1:扫描线法
这题我开始考虑的是扫描线法,因为Meeting Room II那题就是用的扫描线法。但是做下来感觉很难。
1)首先定义pair<eventTime, eventType> eventType: 0 end, 1 start
这里把0定义成end,1定义为start,是因为想排序的时候让end的事件先结束,再考虑start的事件。不然,在这个时间点上就有2个event,不符合实际情况。注意Meeting Room II那题是把1定义成end,0定义为start,那是因为题目要求在这个时间点上算2个事件。
2)把events数组初始化后排序。
3)定义vector<int> counters(50000, -1) 是表示从0..50000每个时间点上的event数,会议开始加1,会议结束减1。注意为什么counters数组初始化为-1而不是0呢?这里我们一开始只能把events里面的时间点的events数对应上,这些时间点之间我们没有处理,所以要初始化它们为-1,跟0(事件全部结束区分开)。比如说一个会议事件是[3..5],那么counters[3]=1,counters[4]=-1, counters[5]=0。
4) 我们根据 
if (counters[i] == -1 && counters[i - 1] > 0) counters[i] = counters[i - 1];
可以把会议的中间点的情况跟会议起始点的情况统一起来。即上面的例子counters[4]也会变成1。
5) 如果某个时间点上counters>=rooms,那么说明这个时间点上不能插入会议了,将该counter=1,否则=0。
6) 这个地方参考的网上思路:
对counter这个数组求一个前缀和。 通过前缀和sums数组我们可以发现,我们查找的l,r区间要求suml,suml+1,suml+2一直到sumr-1都为0,所以在前缀和中的表达为suml-1==sumr-1。 这样我们通过预处理,就能O(1)的处理每一个询问了。

class Solution {
public:
    /**
     * @param intervals: the intervals
     * @param rooms: the sum of rooms
     * @param ask: the ask
     * @return: true or false of each meeting
     */
    vector<bool> meetingRoomIII(vector<vector<int>> &intervals, int rooms, vector<vector<int>> &ask) {
        int askSize = ask.size();
        vector<bool> result;
        int intervalSize = intervals.size();
        vector<pair<int, int>> events; //<eventTime, eventType> eventType: 0 end, 1 start
        vector<int> counters(50000, -1);
        int count = 0;
        int maxTime = 0;
          
        for (int i = 0; i < intervalSize; ++i) {
            events.push_back({intervals[i][0], 1});
            events.push_back({intervals[i][1], 0});
            maxTime = max(maxTime, intervals[i][1]);
        }
      
        sort(events.begin(), events.end());
       
        for (int i = 0; i < events.size(); ++i) {
            if (events[i].second == 1) { //for start events
                count++;
            } else { //for end events
                count--;
            }
            counters[events[i].first] = count;
        }
        
        for (int i = 0; i < ask.size(); ++i) {
            maxTime = max(maxTime, ask[i][1]);
        }

        for (int i = 1; i <= maxTime; ++i) {
            if (counters[i] == -1 && counters[i - 1] > 0) counters[i] = counters[i - 1];
        }

        for (int i = 1; i <= maxTime; ++i) {
             if (counters[i] >= rooms) counters[i] = 1;
             else counters[i] = 0;
        }

        for (int i = 1; i <= maxTime; ++i) {
              counters[i] += counters[i - 1];
        }

        for (int i = 0; i < ask.size(); i++) {
            if (counters[ask[i][0] - 1] == counters[ask[i][1] - 1]) {
                result.push_back(true);
            } else {
                result.push_back(false);
            }
        }

        return result;
    }
};

解法2:这个是我在网上学习的。
思路跟上面差不多。不过更简单。下面的代码就直接得到了counters数组,也不用排序。
        for (int i = 0; i < intervalSize; ++i) {
            counters[intervals[i][0]]++;
            counters[intervals[i][1]]--;
            maxTime = max(maxTime, intervals[i][1]);
        }

class Solution {
public:
    /**
     * @param intervals: the intervals
     * @param rooms: the sum of rooms
     * @param ask: the ask
     * @return: true or false of each meeting
     */
    vector<bool> meetingRoomIII(vector<vector<int>> &intervals, int rooms, vector<vector<int>> &ask) {
        int askSize = ask.size();
        int intervalSize = intervals.size();
        vector<bool> result;
        vector<int> counters(50000, 0);
        vector<int> preSums(50000, 0);
        int count = 0;
        int maxTime = 0;
          
        for (int i = 0; i < intervalSize; ++i) {
            counters[intervals[i][0]]++;
            counters[intervals[i][1]]--;
            maxTime = max(maxTime, intervals[i][1]);
        }
      
        for (int i = 0; i < ask.size(); ++i) {
            maxTime = max(maxTime, ask[i][1]);
        }
        
        int sum = 0;  

        for (int i = 0; i <= maxTime; ++i) {
            sum += counters[i];
            preSums[i] = sum < rooms ? 0 : 1;
        }
        
        for (int i = 1; i <= maxTime; ++i) {
            preSums[i] += preSums[i - 1];
        }
        
        for (int i = 0; i < ask.size(); i++) {
            if (preSums[ask[i][0] - 1] == preSums[ask[i][1] - 1]) {
                result.push_back(true);
            } else {
                result.push_back(false);
            }
        }

        return result;
    }
};

 

Leetcode 253:Meeting Rooms II(超详细的解法!!!) Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required. For example, Given [[0, 30],[5, 10]... 阅读详情

相关推荐

【精】LintCode领扣算法问题答案:1897. 会议室 3

1897. 会议室 3 描述 你有一个当前会议列表intervals,里面表明了每个会议的开始和结束时间,以及一些会议室rooms。现在有一系列会议ask需要加入,逐个判断他们能否被安排进当前的会议列表中而不产生冲突。一个会议室在同一时间只能进行一场会议。每个询问都相互独立。 保证输入可以被安排在rooms个会议室之中 保证任意一个会议的结束时间不大于50000 |Intervals|<=50000 |ask|<=50000 rooms<=20 样例 1: 输入: Intervals

二当家的白帽子 795

【Lintcode】1897. Meeting Room III

题目地址: https://www.lintcode.com/problem/meeting-room-iii/description 给定一个区间组成的数组AAA,每个区间代表一个会议的开始和结束时间。一共有rrr个会议室。再给定若干个询问,问(a,b)(a,b)(a,b)这个会议是否可以加入。如果两个会议一个结束而另一个恰好在这个时刻开始,这样认为是不冲突的。题目保证AAA里的会议是可以合法安排到rrr个会议室里的。 思路是扫描线。开一个数组MMM,对于会议(a,b)(a,b)(a,b),我们让M[a]

数学、算法爱好者的博客 724

TC8测试TCP-UNACCEPTABLE-04/006

TC8测试TCP-UNACCEPTABLE-04/006

leetcode 2402. Meeting Rooms III(python)

像这种题直接使用两个小根堆来解决即可,因为会议室有两种状态——空闲和正在使用,我们就定义两个小根堆 free 和 using ,free 中按照从小到大存储会议室编号,using 中按照(会议的结束时间,正在使用的会议室编号)来按照从小到大存储,因为会议室有“先到先得”的条件,所以我们将 meetings 进行排序,另外定义一个计数器 cnt 来对每个会议室的使用情况进行统计。有编号从 0 到 n - 1 的 n 个房间,。最后我们遍历 cnt ,找出出现次数最多,但是序号大小最小的会议室编号,返回即可。

王大呀呀的博客 638

MQTT在智能家居中的实战:用Android手机控制ESP8266设备(基于EMQX)

本文详细介绍了如何利用MQTT协议构建一个完整的智能家居控制系统,通过Android手机App远程操控ESP8266设备。文章提供了从EMQX服务器部署、ESP8266端Arduino固件开发到Android客户端搭建的完整实战指南,并深入探讨了系统联调、稳定性优化与安全加固等关键环节,为物联网开发者提供了一套可复用的解决方案。

ujm567890的博客 457

VisionPro实战:5个工业视觉检测案例详解(附代码片段)

本文详细解析了VisionPro在工业视觉检测中的5个实战案例,包括PCB焊点质量检测、汽车齿轮尺寸测量、药品包装缺陷检测等。通过硬件配置方案和软件算法流程的详细介绍,帮助工程师快速掌握VisionPro的应用技巧,提升工业自动化检测效率。

weixin_29284657的博客 518

meeting room III

class TimeNode { int time; int end; public TimeNode(int time, int end){ this.time = time; this.end = end; } } private List find11(int[][] intervals) { List tnList = new LinkedList<

sjphiChina的博客 449

Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现

Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现 一、简单介绍 二、Car Racing 2D (2D赛车) 游戏内容与操作 三、相关说明 四、游戏代码框架 五、知识点 六、游戏效果预览 七、实现步骤 八、工程源码地址 九、延伸扩展 一、简单介绍 Unity 游戏实例开发集合,使用简单易懂的方式,讲解常见游戏的开发实现过程,方便

仙魁XAN 7701

LintCode 919: Meeting Rooms II (扫描线算法经典题)

Meeting Rooms II Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],…] (si &lt; ei), find the minimum number of conference rooms required. Example Given inte...

roufoo的博客 1128

R语言安装包镜像报错?5分钟教你快速切换国内镜像源(含清华/阿里云配置)

本文详细介绍了R语言安装包镜像报错的解决方案,包括如何快速切换国内镜像源(如清华、阿里云等),解决'无法读写貯藏處索引'等常见问题。通过图形界面和命令行两种方式,帮助用户高效配置镜像源,提升R语言包安装速度与稳定性。

weixin_29053073的博客 418

基于 VS Code + CMake + Make + GNU工具链 + OpenOCD 的通用MCU开发环境搭建教程

以CH32V307(RISCV)和STM32F103(Cortex-M3)为例的Vscode+gnu单片机环境搭建。

余十三_的博客 2173

Leetcode 253 Meeting Room II

leetcode 253:Meeting Room II题目解法解法1:利用最小堆算法解法2:利用扫描线 题目 Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],…] (si < ei), find the minimum number of conferen...

qq_37821701的博客 897

在 SAP 中,Primary Cost Element(初级成本要素)与Secondary Cost Element(次级成本要素)的核心区别、作用及业务含义可归纳如下

摘要:SAP中初级成本要素与次级成本要素的核心区别在于:初级要素必须关联FI模块的损益科目,直接影响财务报表,用于记录外部成本(如电费、薪酬);次级要素仅存在于CO模块,用于内部成本分配(如分摊、作业分配),不影响外部报表。初级要素是"外部成本入口",次级要素是"内部成本搬运工",二者共同实现成本的多维度追踪与管理。

金牌架构师 759

lintcode-----meeting roomII

题目描述: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],…] (si &lt; ei), find the minimum number of conference rooms required. 样例: Given intervals = [(0,30...

一直在路上的羊的博客 592

大数据领域数据产品的团队激励与绩效管理

在大数据领域,数据产品的成功离不开高效协作的团队。团队激励与绩效管理的目的在于激发团队成员的工作热情和创造力,提高工作效率和质量,确保数据产品能够按时、高质量地交付。本文章的范围涵盖了大数据领域数据产品团队激励与绩效管理的各个方面,包括激励机制的设计、绩效评估的方法、团队沟通与协作等。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确相关概念的定义和相互关系;接着讲解核心算法原理和具体操作步骤,为团队激励与绩效管理提供理论支持和实践指导;然后分析数学模型和公式,帮助读者深入理解绩效评估的原理;

Java大师兄的博客 1018

基于STM32L4XX、HAL库的 L76KB-A58定位模块驱动程序设计

/ 确保字符串终止。// 缓冲区溢出,重置。// 重置缓冲区索引。支持GPS、GLONASS、Galileo、北斗和QZSS多系统定位。case 1: // UTC时间。// 配置GPS模块(可选)// 查找GGA语句。// 启动UART接收。// USART1初始化函数。内置LNA和SAW滤波器。

zhusl6688的博客 349

Meeting Rooms II

Given an array of meeting time intervals consisting of start and end times[[s1,e1],[s2,e2],...](si< ei), find the minimum number of conference rooms required. For example, Given[[0, 30],[5,...

leetcode 解题思路 1155

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

lintcode会议室

给定一系列的会议时间间隔,包括起始和结束时间[[s1,e1],[s2,e2],…(si < ei),确定一个人是否可以参加所有会议。 """ Definition of Interval. class Interval(object): def __init__(self, start, end): self.start = start self.en...

qq_32371827的博客 461

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[Facebook 面试题]Meeting roomII 变形题

facebook 二面题目: interval [startTime, stoptime)   ----integral  time stamps 给这样的一串区间 I1, I2......In   找出 一个 time stamp  出现在interval的次数最多。 startTime example:  [1,3),  [2, 7),   [4,  8),   [5, 9)

快乐的小鸟_ZJU 1219

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Leetcode】252,253 meeting room系列 区间问题

252,给出一堆闭区间,问这些区间是否互相都不相交 思路是对区间按照第一位排序,然后遍历排序后的区间,维护一个第二位的最小值,看是否有一个区间额第一位大于该最小值,如果有那么这两个区间肯定不相交。 public boolean isInterval(int[][] intervals){ List pairs = new ArrayList<>(); for(int i = 0; i

u010900754的专栏 2534

vector bool 引发的如何发现问题的思考

前段时间,在项目开发过程之中,自己遇到了一个奇怪的问题。使用了vector&lt;bool&gt;,而将vector&lt;bool&gt;的元素值,作为引用值去传参数的时候,报了个莫名其妙的错。当时因为在赶进度,觉得根据自己的理解,可能一时半会搞不定,就没有深纠,另外,觉得这可能会是一个好问题,就先把这个问题记下来,先不管,尝试用其他办法先把项目实现先搞定,等主要工作完成之后,再尝试回过头来安排...

werflychen的专栏 711

会议室预订系统(meeting room booking system)

一、目标及业务流程 期望效果: 业务流程: 用户登录 预定会议室 退订会议室 选择日期;今日以及以后日期 二、表结构设计和生成 1、models.py(用户继承AbstractUser) from django.db import models # Create your models here. from django.db import mode...

anmi3721的博客 2713

Lintcode 1897 · Meeting Room III [Python]

G家的题目确实质量高,扫描线+前缀和,尤其是前缀和的使用上考察上,很有点儿东西。首先设置时间线数组记录一个会议开始和结束,开始的地方设置+1,结束的时候-1,然后开始遍历这个时间线数组,并做前缀和计算,目的是看某一段内有多少个会议,当前缀和数字大于等于会议室数量的地方,我们在前缀和的数组里设置为1,而少于会议室数量的时候设置为0,则,两个1之间的0的持续段落就是可以放置会议的地方,随后,我们将得到的前缀和数组再次进行前缀和计算,则我们可以通过数组里,一段区间内的数字的不改变知道哪些连续的区域内可以满足放置新

sinat_30403031的博客 245

[Leetcode] 253. Meeting Rooms II 解题报告

题目: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required. For example, Given [[0,

魔豆(Magicbean)的博客 1335

CodeForces - 612D (排序+区间计数+扫描线 区间覆盖)

题目链接:http://codeforces.com/problemset/problem/612/D题目大意:给出n条线段,让你算这些线段重合次数大于等于k次的部分输入:第一行:给出两个数n k 分别表示要输入的线段个数和所需的线段最少重叠次数接下来n行 每行一个l r表示线段的左端点和右端点。解题思路:至于这道题:区间覆盖问题 ,先把...

dengyan1183的博客 274

Facebook面试题 meeting rooms 求同时最多meeting room的时间

给出会议开始和结束时间,求meeting room interval最多的时间点。返回任意一个时间即可。

正西风落叶下长安 2083
上一篇: LintCode 1496: Implement Rand10() Using Rand7() (随机数生成好题)
下一篇: LintCode 1364: the minium distance (BFS 传送门好题)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值