1. 程式人生 > >[lintcode] 1552.停車問題 [Medium]

[lintcode] 1552.停車問題 [Medium]

描述

小明中午出去買飲料,路過一家公共停車場,出於程式設計師的職業習慣,他很想知道這個停車場上午的最大化利用率有多少。 經與門衛大叔溝通,他獲得了該停車場上午車輛入場時間與出場時間的記錄表(資料格式參考樣例輸入), 你能通過拿到的資料寫一個函式快速的幫小明算出這家停車場,上午最多的時候同時停放了多少輛車嗎?

樣例

給出 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;
    }
};