题目较长,略,链接:题目链接
分析:
- 使用优先队列存放销售和和购买订单,销售订单从小到大排序,购买订单从大到小排序
- 使用res记录订单数
- 用while循环,去抵消销售订单和购买订单
class Solution {
public:
int getNumberOfBacklogOrders(vector<vector<int>>& orders) {
// buy 大-小 sell 小-大
typedef pair<int,int> PII;
priority_queue<PII> BUY; // 默认是大根堆
priority_queue<PII,vector<PII>,greater<PII>> SELL; // 小根堆
int res = 0;
for(int i = 0; i < orders.size(); i ++)
{
int price = orders[i][0] , count = orders[i][1] , type = orders[i][2];
if(type == 0) // buy
{
BUY.push({price,count});
}else // sell
{
SELL.push({price,count});
}
res += count;
// 拿着购买的订单去更新销售的订单
while(BUY.size())
{
if(SELL.empty() || BUY.top().first > SELL.top().first) break;
PII b = BUY.top();
BUY.pop();
PII s = SELL.top();
SELL.pop();
int temp = min(b.second , s.second);
b.second -= temp;
s.second -= temp;
res -= temp * 2;
if(b.second) BUY.push(b);
else SELL.push(s);
}
}
int mod = 1e9 + 7;
return res % mod;
}
};