Meeting Room III

Jul 4, 2021

LintCodearrow-up-right

1. Prefix Sum 解法:

这道题的重点是如何快速处理每个ask中的query,即快速得知某一段时间是否available。因为时间的范围并不大,只有50k,我们可以开一个这么大的数组,这样对于每个分钟都可以分别记录状态。

这里我们可以反过来考虑,如果有一个数组标记状态,如何能快速得知一段时间是否OK?我们可以先将所有OK的时间都标记为0,不OK的时间标记为1,然后求prefixSum,这样对于一段时间的左右两端,如果他们之间的时间都OK,则意味着prefixSum在这一段没有变化,我们就可以利用这点快速求解。

然后如何知道某一分钟是否OK?我们可以先对于每个interval标记event,按照start +1,end -1的方法,然后从左到右扫描所有event,可以得到每一分钟需要的最少room数量,然后对于没有空room的分钟标记为1,有空room的分钟标记为0即可。

还有一点,在得到prefixSum之后,判断时间点[p,q] 是否OK实际上要判断的是if (prefixSum[q - 1] == prefixSum[p - 1]) 这里的 -1 是因为上一个event结束的同时下一个就可以开始,所以需要1分钟的错位。

Java Code:

2. 线段树解法

我们可以利用线段树的性质,对于这道题目而言,我们可以在线段树中维持每个区间需要的最小房间数量。对于一个大区间,它所存放的是左右两个小区间的所需房间数量的最大值。所以事实上这里所需要的是一个维持maxValue的线段树。

Java Code

Last updated