插: 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站噩翠,通俗易懂氛魁,風(fēng)趣幽默,忍不住分享一下給大家隆箩。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
堅(jiān)持不懈羔杨,越努力越幸運(yùn)捌臊,大家一起學(xué)習(xí)鴨~~~
題目:
給你一個(gè)二維整數(shù)數(shù)組 orders ,其中每個(gè) orders[i] = [pricei, amounti, orderTypei] 表示有 amounti 筆類型為 orderTypei 兜材、價(jià)格為 pricei 的訂單理澎。
訂單類型 orderTypei 可以分為兩種:
0 表示這是一批采購(gòu)訂單 buy
1 表示這是一批銷售訂單 sell
注意,orders[i] 表示一批共計(jì) amounti 筆的獨(dú)立訂單曙寡,這些訂單的價(jià)格和類型相同糠爬。對(duì)于所有有效的 i ,由 orders[i] 表示的所有訂單提交時(shí)間均早于 orders[i+1] 表示的所有訂單举庶。
存在由未執(zhí)行訂單組成的 積壓訂單 执隧。積壓訂單最初是空的。提交訂單時(shí),會(huì)發(fā)生以下情況:
如果該訂單是一筆采購(gòu)訂單 buy 镀琉,則可以查看積壓訂單中價(jià)格 最低 的銷售訂單 sell 峦嗤。如果該銷售訂單 sell 的價(jià)格 低于或等于 當(dāng)前采購(gòu)訂單 buy 的價(jià)格,則匹配并執(zhí)行這兩筆訂單屋摔,并將銷售訂單 sell 從積壓訂單中刪除寻仗。否則,采購(gòu)訂單 buy 將會(huì)添加到積壓訂單中凡壤。
反之亦然署尤,如果該訂單是一筆銷售訂單 sell ,則可以查看積壓訂單中價(jià)格 最高 的采購(gòu)訂單 buy 亚侠。如果該采購(gòu)訂單 buy 的價(jià)格 高于或等于 當(dāng)前銷售訂單 sell 的價(jià)格曹体,則匹配并執(zhí)行這兩筆訂單,并將采購(gòu)訂單 buy 從積壓訂單中刪除硝烂。否則箕别,銷售訂單 sell 將會(huì)添加到積壓訂單中。
輸入所有訂單后滞谢,返回積壓訂單中的 訂單總數(shù) 串稀。由于數(shù)字可能很大,所以需要返回對(duì) 109 + 7 取余的結(jié)果狮杨。
示例 1:
輸入:orders = [[10,5,0],[15,2,1],[25,1,1],[30,4,0]]
輸出:6
解釋:輸入訂單后會(huì)發(fā)生下述情況:
- 提交 5 筆采購(gòu)訂單母截,價(jià)格為 10 。沒有銷售訂單橄教,所以這 5 筆訂單添加到積壓訂單中清寇。
- 提交 2 筆銷售訂單,價(jià)格為 15 护蝶。沒有采購(gòu)訂單的價(jià)格大于或等于 15 华烟,所以這 2 筆訂單添加到積壓訂單中。
- 提交 1 筆銷售訂單持灰,價(jià)格為 25 盔夜。沒有采購(gòu)訂單的價(jià)格大于或等于 25 ,所以這 1 筆訂單添加到積壓訂單中堤魁。
-
提交 4 筆采購(gòu)訂單喂链,價(jià)格為 30 。前 2 筆采購(gòu)訂單與價(jià)格最低(價(jià)格為 15)的 2 筆銷售訂單匹配姨涡,從積壓訂單中刪除這 2 筆銷售訂單衩藤。第 3 筆采購(gòu)訂單與價(jià)格最低的 1 筆銷售訂單匹配,銷售訂單價(jià)格為 25 涛漂,從積壓訂單中刪除這 1 筆銷售訂單赏表。積壓訂單中不存在更多銷售訂單检诗,所以第 4 筆采購(gòu)訂單需要添加到積壓訂單中。
最終瓢剿,積壓訂單中有 5 筆價(jià)格為 10 的采購(gòu)訂單逢慌,和 1 筆價(jià)格為 30 的采購(gòu)訂單。所以積壓訂單中的訂單總數(shù)為 6 间狂。
示例 2:
輸入:orders = [[7,1000000000,1],[15,3,0],[5,999999995,0],[5,1,1]]
輸出:999999984
解釋:輸入訂單后會(huì)發(fā)生下述情況: - 提交 109 筆銷售訂單攻泼,價(jià)格為 7 。沒有采購(gòu)訂單鉴象,所以這 109 筆訂單添加到積壓訂單中忙菠。
- 提交 3 筆采購(gòu)訂單,價(jià)格為 15 纺弊。這些采購(gòu)訂單與價(jià)格最低(價(jià)格為 7 )的 3 筆銷售訂單匹配牛欢,從積壓訂單中刪除這 3 筆銷售訂單。
- 提交 999999995 筆采購(gòu)訂單淆游,價(jià)格為 5 傍睹。銷售訂單的最低價(jià)為 7 ,所以這 999999995 筆訂單添加到積壓訂單中犹菱。
- 提交 1 筆銷售訂單拾稳,價(jià)格為 5 。這筆銷售訂單與價(jià)格最高(價(jià)格為 5 )的 1 筆采購(gòu)訂單匹配腊脱,從積壓訂單中刪除這 1 筆采購(gòu)訂單访得。
最終,積壓訂單中有 (1000000000-3) 筆價(jià)格為 7 的銷售訂單虑椎,和 (999999995-1) 筆價(jià)格為 5 的采購(gòu)訂單震鹉。所以積壓訂單中的訂單總數(shù)為 1999999991 ,等于 999999984 % (109 + 7) 捆姜。
java代碼:
class Solution {
public int getNumberOfBacklogOrders(int[][] orders) {
final int MOD = 1000000007;
PriorityQueue<int[]> buyOrders = new PriorityQueue<int[]>((a, b) -> b[0] - a[0]);
PriorityQueue<int[]> sellOrders = new PriorityQueue<int[]>((a, b) -> a[0] - b[0]);
for (int[] order : orders) {
int price = order[0], amount = order[1], orderType = order[2];
if (orderType == 0) {
while (amount > 0 && !sellOrders.isEmpty() && sellOrders.peek()[0] <= price) {
int[] sellOrder = sellOrders.poll();
int sellAmount = Math.min(amount, sellOrder[1]);
amount -= sellAmount;
sellOrder[1] -= sellAmount;
if (sellOrder[1] > 0) {
sellOrders.offer(sellOrder);
}
}
if (amount > 0) {
buyOrders.offer(new int[]{price, amount});
}
} else {
while (amount > 0 && !buyOrders.isEmpty() && buyOrders.peek()[0] >= price) {
int[] buyOrder = buyOrders.poll();
int buyAmount = Math.min(amount, buyOrder[1]);
amount -= buyAmount;
buyOrder[1] -= buyAmount;
if (buyOrder[1] > 0) {
buyOrders.offer(buyOrder);
}
}
if (amount > 0) {
sellOrders.offer(new int[]{price, amount});
}
}
}
int total = 0;
for (PriorityQueue<int[]> pq : Arrays.asList(buyOrders, sellOrders)) {
while (!pq.isEmpty()) {
int[] order = pq.poll();
total = (total + order[1]) % MOD;
}
}
return total;
}
}