[lintcode] 1552.停車問題 [Medium]
阿新 • • 發佈:2018-12-18
描述
小明中午出去買飲料,路過一家公共停車場,出於程式設計師的職業習慣,他很想知道這個停車場上午的最大化利用率有多少。 經與門衛大叔溝通,他獲得了該停車場上午車輛入場時間與出場時間的記錄表(資料格式參考樣例輸入), 你能通過拿到的資料寫一個函式快速的幫小明算出這家停車場,上午最多的時候同時停放了多少輛車嗎?
樣例
給出 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; } };