题目描述

5710. 积压订单中的订单总数

题解

题目不难,主要是要读懂题意,一步步模拟,代码较长,需要细心检查。

坑较多,比如我犯了很多傻逼问题:想都不想就拿1<<9+7当作1000000007,更傻逼的是,<<的优先级低于+号,<<都没用对。

实时取最大和最小,可以用堆或者优先队列实现。这里我使用了Java的TreeMap。

class Solution {
public static int getNumberOfBacklogOrders(int[][] orders) {
TreeMap<Integer,Long> sells = new TreeMap<>();//价格:数量
TreeMap<Integer,Long> buys = new TreeMap<>();//价格:数量
for(int i=0;i<orders.length;i++){
if(orders[i][2]==0){//buy
long curBuyAmount = orders[i][1];
int buyPrice = orders[i][0];
while (curBuyAmount>0){
if(sells.isEmpty()){
buys.put(buyPrice,buys.getOrDefault(buyPrice,0l)+curBuyAmount);//添加剩余的订单到积压订单
break;
}
if(sells.firstKey()<=buyPrice){
if(curBuyAmount<sells.get(sells.firstKey())){
sells.put(sells.firstKey(),sells.get(sells.firstKey())-curBuyAmount);
curBuyAmount = 0;
}else{
curBuyAmount -= sells.get(sells.firstKey());
sells.remove(sells.firstKey());
}
}else{
buys.put(buyPrice,buys.getOrDefault(buyPrice,0l)+curBuyAmount);//添加剩余的订单到积压订单
break;
}
}
}else{//sell
long curSellAmount = orders[i][1];
int sellPrice = orders[i][0];
while (curSellAmount>0){
if(buys.isEmpty()){
sells.put(sellPrice,sells.getOrDefault(sellPrice,0l)+curSellAmount);
break;
}
if(buys.lastKey()>=sellPrice){
if(curSellAmount<buys.get(buys.lastKey())){
buys.put(buys.lastKey(),buys.get(buys.lastKey())-curSellAmount);
curSellAmount = 0;
}else{
curSellAmount -= buys.get(buys.lastKey());
buys.remove(buys.lastKey());
}
}else{
sells.put(sellPrice,sells.getOrDefault(sellPrice,0l)+curSellAmount);//添加剩余的订单到积压订单
break;
}
}
}
}
long mod = 1000000007;
long overStockNum = 0;
for(Long i:buys.values()){
overStockNum = (overStockNum + i)%mod;//实时取模
}
for(Long i:sells.values()){
overStockNum = (overStockNum + i)%mod;
}
return (int)(overStockNum%mod);
}
}

堆&&优先队列&&TreeMap的更多相关文章

  1. 纯数据结构Java实现(6/11)(二叉堆&优先队列)

    堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...

  2. Running Median POJ - 3784 (对顶堆/优先队列 | 链表)

    For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After ...

  3. POJ 2442 - Sequence - [小顶堆][优先队列]

    题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...

  4. 【bzoj2151】种树(堆/优先队列+双向链表)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 这道题因为优先队列不怎么会用,而且手写堆的代码也不长,也想复习一下手写堆的写法…… ...

  5. poj 1442 Black Box(堆 优先队列)

    题目:http://poj.org/problem?id=1442 题意:n,m,分别是a数组,u数组的个数,u[i]w为几,就加到a几,然后输出第i 小的 刚开始用了一个小顶堆,超时,后来看了看别人 ...

  6. 算法&数据结构系列 -- 堆(优先队列)

    前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...

  7. [luoguP1631] 序列合并(堆 || 优先队列)

    传送门 首先,把A和B两个序列分别从小到大排序,变成两个有序队列.这样,从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列: A[1]+B[1] <= A[1]+B[ ...

  8. P1168 中位数[堆 优先队列]

    题目描述 给出一个长度为NNN的非负整数序列AiA_iAi​,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3 ...

  9. 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列

    剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...

随机推荐

  1. 基于端口划分vlan

    基于端口划分vlan 拓扑图 PC ip 配置 PC 5:192.168.1.5 PC 6:192.168.1.6 PC 7:192.168.1.7 PC 8: 192.168.1.8 交换机配置 创 ...

  2. TCP/IP协议三次握手_四次挥手

    TCP/IP协议 TCP是一种面向连接的端到端的可靠传输协议. TCP报头格式 三次握手的过程 一.客户端发送一个连接请求,发送一个随机数X,这时客户端的端口状态变为SYN_SENT状态. 二.服务端 ...

  3. FOC_矢量控制相关资料

    http://www.eepw.com.cn/news/listbylabel/label/FOC/ FOC(field-oriented control)为磁场导向控制,又称为矢量控制(vector ...

  4. hive sql的参数调优

    shuffle优化之减少shuffle数据量 1.谓词下推  hive.optimize.ppd ,默认为true. 所谓谓词下推就是过滤条件如果写在shuffle操作后面,就提前过滤掉,减少参与sh ...

  5. 阿里云RDs 网络白名单 专用网络 经典网络

    云服务为了安全性总是有不同的安全规则,第一就是需要明白里面的网络类型   专有网络是您自己独有的云上私有网络.您可以完全掌控自己的专有网络,例如选择IP地址范围.配置路由表和网关等,您可以在自己定义的 ...

  6. Day30 BigInteger和BigDecimal

    BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...

  7. Stopper的使用

    工具类,抽象死循环逻辑的 import java.util.concurrent.atomic.AtomicBoolean; /** * if the process closes, a signal ...

  8. TensorRT-优化-原理

    TensorRT-优化-原理 一.优化方式 TentsorRT 优化方式: TensorRT优化方法主要有以下几种方式,最主要的是前面两种. 层间融合或张量融合(Layer & Tensor ...

  9. 英伟达TRTTorch

    英伟达TRTTorch PyTorch JIT的提前(AOT)编译Ahead of Time (AOT) compiling for PyTorch JIT TRTorch是PyTorch / Tor ...

  10. CodeGen准备存储库

    CodeGen准备存储库 CodeGen几乎总是与提供用于生成源文件的元数据的存储库结构一起使用,并且许多令牌需要使用存储库结构. 基本要求是有一个结构定义,并且该结构定义包含一个或多个字段定义.有些 ...