生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1801. 积压订单中的订单总数(map)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
給你一個二維整數數組 orders ,其中每個 orders[i] = [pricei, amounti, orderTypei] 表示有 amounti 筆類型為 orderTypei 、價格為 pricei 的訂單。
訂單類型 orderTypei 可以分為兩種:
- 0 表示這是一批采購訂單 buy
- 1 表示這是一批銷售訂單 sell
注意,orders[i] 表示一批共計 amounti 筆的獨立訂單,這些訂單的價格和類型相同。
對于所有有效的 i ,由 orders[i] 表示的所有訂單提交時間均早于 orders[i+1] 表示的所有訂單。
存在由未執行訂單組成的 積壓訂單 。積壓訂單最初是空的。提交訂單時,會發生以下情況:
- 如果該訂單是一筆采購訂單 buy ,則可以查看積壓訂單中價格 最低 的銷售訂單 sell 。如果該銷售訂單 sell 的價格 低于或等于 當前采購訂單 buy 的價格,則匹配并執行這兩筆訂單,并將銷售訂單 sell 從積壓訂單中刪除。否則,采購訂單 buy 將會添加到積壓訂單中。
- 反之亦然,如果該訂單是一筆銷售訂單 sell ,則可以查看積壓訂單中價格 最高 的采購訂單 buy 。如果該采購訂單 buy 的價格 高于或等于 當前銷售訂單 sell 的價格,則匹配并執行這兩筆訂單,并將采購訂單 buy 從積壓訂單中刪除。否則,銷售訂單 sell 將會添加到積壓訂單中。
輸入所有訂單后,返回積壓訂單中的 訂單總數 。
由于數字可能很大,所以需要返回對 10^9 + 7 取余的結果。
示例 1:
輸入:orders
= [[10,5,0],[15,2,1],[25,1,1],[30,4,0]]
輸出:
6
解釋:輸入訂單后會發生下述情況:
- 提交
5 筆采購訂單,價格為
10 。沒有銷售訂單,所以這
5 筆訂單添加到積壓訂單中。
- 提交
2 筆銷售訂單,價格為
15 。沒有采購訂單的價格大于或等于
15 ,所以這
2 筆訂單添加到積壓訂單中。
- 提交
1 筆銷售訂單,價格為
25 。沒有采購訂單的價格大于或等于
25 ,所以這
1 筆訂單添加到積壓訂單中。
- 提交
4 筆采購訂單,價格為
30 。前
2 筆采購訂單與價格最低(價格為
15)的
2 筆銷售訂單匹配,從積壓訂單中刪除這
2 筆銷售訂單。第
3 筆采購訂單與價格最低的
1 筆銷售訂單匹配,銷售訂單價格為
25 ,從積壓訂單中刪除這
1 筆銷售訂單。積壓訂單中不存在更多銷售訂單,所以第
4 筆采購訂單需要添加到積壓訂單中。
最終,積壓訂單中有
5 筆價格為
10 的采購訂單,和
1 筆價格為
30 的采購訂單。所以積壓訂單中的訂單總數為
6 。
示例 2:
輸入:orders
= [[7,1000000000,1],[15,3,0],[5,999999995,0],[5,1,1]]
輸出:
999999984
解釋:輸入訂單后會發生下述情況:
- 提交
109 筆銷售訂單,價格為
7 。沒有采購訂單,所以這
109 筆訂單添加到積壓訂單中。
- 提交
3 筆采購訂單,價格為
15 。這些采購訂單與價格最低(價格為
7 )的
3 筆銷售訂單匹配,從積壓訂單中刪除這
3 筆銷售訂單。
- 提交
999999995 筆采購訂單,價格為
5 。銷售訂單的最低價為
7 ,所以這
999999995 筆訂單添加到積壓訂單中。
- 提交
1 筆銷售訂單,價格為
5 。這筆銷售訂單與價格最高(價格為
5 )的
1 筆采購訂單匹配,從積壓訂單中刪除這
1 筆采購訂單。
最終,積壓訂單中有
(1000000000-3) 筆價格為
7 的銷售訂單,和
(999999995-1) 筆價格為
5 的采購訂單。所以積壓訂單中的訂單總數為
1999999991 ,等于
999999984 % (10^9 + 7) 。提示:
1 <= orders
.length
<= 10^5
orders
[i
].length
== 3
1 <= pricei
, amounti
<= 10^9
orderTypei 為
0 或
1
https://leetcode-cn.com/problems/number-of-orders-in-the-backlog/
2. 解題
typedef pair
<int,int> pii
;
struct cmp
{bool operator()(int a
, int b
) const{return a
> b
;}
};
class Solution {
public:int getNumberOfBacklogOrders(vector
<vector
<int>>& orders
) {map
<int, long long> qsell
;map
<int,long long,cmp
> qbuy
;for(int i
= 0; i
< orders
.size(); ++i
){int num
= orders
[i
][1];int price
= orders
[i
][0];if(orders
[i
][2] == 0){for(auto it
=qsell
.begin(); it
!= qsell
.end() && num
; ){if(price
>= it
->first
){if(it
->second
> num
){it
->second
-= num
;num
= 0;break;}else{num
-= it
->second
;it
->second
= 0;qsell
.erase(it
++);}}elsebreak;}if(num
){qbuy
[price
] += num
;}}else{for(auto it
=qbuy
.begin(); it
!= qbuy
.end() && num
; ){if(price
<= it
->first
){if(it
->second
> num
){it
->second
-= num
;num
= 0;break;}else{num
-= it
->second
;it
->second
= 0;qbuy
.erase(it
++);}}elsebreak;}if(num
){qsell
[price
] += num
;}}}long long ans
= 0, mod
= 1e9+7;for(auto it
=qsell
.begin(); it
!= qsell
.end(); ++it
){ans
= (ans
+ it
->second
)%mod
;}for(auto it
=qbuy
.begin(); it
!= qbuy
.end(); ++it
){ans
= (ans
+ it
->second
)%mod
;}return ans
;}
};
248 ms 62.9 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1801. 积压订单中的订单总数(map)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。