描述
小明中午出去买饮料,路过一家公共停车场,出于程序员的职业习惯,他很想知道这个停车场上午的最大化利用率有多少。
经与门卫大叔沟通,他获得了该停车场上午车辆入场时间与出场时间的记录表(数据格式参考样例输入),
你能通过拿到的数据写一个函数快速的帮小明算出这家停车场,上午最多的时候同时停放了多少辆车吗?
样例
给出 a = [[8,9],[4,6],[3,7],[6,8]]
,返回 2
。
`解释:
[4,6]或[6,7]时刻停车场有2辆车,其余时间最多就1辆车。`
给出 a = [[1,2],[2,3],[3,4],[4,5]]
, 返回 1。
- 为方便起见,简化计算,驶入时间和开出时间以整点记录,如9点,10点
- 如停车记录中入场时间晚于出场时间,该停车记录视为无效,如[7,3]
- 假定如果有多辆车同时出入场,出场车辆优先
- 停车记录数不超过100000100000,时间点不超过1e9
思路
这道题的思路还是比较容易的。给进出的车都设置一个堆就行了。主要容易有bug的点感觉是无效数据(一开始没看题的辛酸)。
代码
class Solution {
public:
/**
* @param a: the Parking Record
* @return: The max number of cars
*/
int getMax(vector<vector<int>> &a) {
int curCarNum = 0;
int max = 0;
priority_queue<int, vector<int>, greater<int>> inQueue;
priority_queue<int, vector<int>, greater<int>> outQueue;
for(auto io: a)
{
if(io[0] > io[1])
{
continue;
}
inQueue.push(io[0]);
outQueue.push(io[1]);
}
while(!outQueue.empty() && !inQueue.empty())
{
int nextOutTime = outQueue.top();
while(inQueue.top() < nextOutTime && !inQueue.empty())
{
inQueue.pop();
curCarNum += 1;
if(curCarNum > max)
{
max = curCarNum;
}
}
while(inQueue.top() > nextOutTime && !outQueue.empty())
{
outQueue.pop();
nextOutTime = outQueue.top();
curCarNum -= 1;
}
if(inQueue.top() == nextOutTime)
{
inQueue.pop();
outQueue.pop();
}
}
return max;
}
};