Сложность: medium
Дан двумерный целочисленный массив
orders, где каждый элемент orders[i] = [pricei, amounti, orderTypei] обозначает, что было размещено amounti заказов типа orderTypei по цене pricei. Тип заказа orderTypei может быть:-
0, если это партия заказов на покупку, или-
1, если это партия заказов на продажу.Обратите внимание, что
orders[i] представляет собой партию из amounti независимых заказов с одинаковой ценой и типом. Все заказы, представленные orders[i], будут размещены перед всеми заказами, представленными orders[i+1] для всех допустимых i.Существует список невыполненных заказов (backlog), который изначально пуст. При размещении заказа происходит следующее:
- Если это заказ на покупку, вы просматриваете заказ на продажу с наименьшей ценой в списке невыполненных заказов. Если цена этого заказа на продажу меньше или равна цене текущего заказа на покупку, они будут сопоставлены и выполнены, и этот заказ на продажу будет удален из списка. В противном случае заказ на покупку добавляется в список невыполненных заказов.
- Если это заказ на продажу, вы просматриваете заказ на покупку с наибольшей ценой в списке невыполненных заказов. Если цена этого заказа на покупку больше или равна цене текущего заказа на продажу, они будут сопоставлены и выполнены, и этот заказ на покупку будет удален из списка. В противном случае заказ на продажу добавляется в список невыполненных заказов.
Верните общее количество заказов в списке невыполненных заказов после размещения всех заказов из входных данных. Поскольку это число может быть большим, верните его по модулю
10^9 + 7.Пример:
Input: orders = [[10,5,0],[15,2,1],[25,1,1],[30,4,0]]
Output: 6
👨💻 Алгоритм:
1⃣Обрабатывайте каждый заказ в orders. Для заказа на покупку сравните с самыми дешевыми заказами на продажу в списке и выполняйте их при возможности, иначе добавьте в список.
2⃣Для заказа на продажу сравните с самыми дорогими заказами на покупку в списке и выполняйте их при возможности, иначе добавьте в список.
3⃣Подсчитайте общее количество оставшихся заказов в списке и верните его по модулю 10^9 + 7.
😎 Решение:
class Solution:
def getNumberOfBacklogOrders(self, orders: List[List[int]]) -> int:
buyOrders, sellOrders = [], []
MOD = 1_000_000_007
for price, amount, orderType in orders:
if orderType == 0:
while amount > 0 and sellOrders and sellOrders[0][0] <= price:
sellOrder = heapq.heappop(sellOrders)
executedAmount = min(amount, sellOrder[1])
amount -= executedAmount
if sellOrder[1] > executedAmount:
heapq.heappush(sellOrders, (sellOrder[0], sellOrder[1] - executedAmount))
if amount > 0:
heapq.heappush(buyOrders, (-price, amount))
else:
while amount > 0 and buyOrders and -buyOrders[0][0] >= price:
buyOrder = heapq.heappop(buyOrders)
executedAmount = min(amount, buyOrder[1])
amount -= executedAmount
if buyOrder[1] > executedAmount:
heapq.heappush(buyOrders, (buyOrder[0], buyOrder[1] - executedAmount))
if amount > 0:
heapq.heappush(sellOrders, (price, amount))
return sum(amount for _, amount in buyOrders + sellOrders) % MOD
Ставь 👍 и забирай 📚 Базу знаний