堆&&优先队列&&TreeMap
题目描述
题解
题目不难,主要是要读懂题意,一步步模拟,代码较长,需要细心检查。
坑较多,比如我犯了很多傻逼问题:想都不想就拿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的更多相关文章
- 纯数据结构Java实现(6/11)(二叉堆&优先队列)
堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...
- Running Median POJ - 3784 (对顶堆/优先队列 | 链表)
For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After ...
- POJ 2442 - Sequence - [小顶堆][优先队列]
题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...
- 【bzoj2151】种树(堆/优先队列+双向链表)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 这道题因为优先队列不怎么会用,而且手写堆的代码也不长,也想复习一下手写堆的写法…… ...
- poj 1442 Black Box(堆 优先队列)
题目:http://poj.org/problem?id=1442 题意:n,m,分别是a数组,u数组的个数,u[i]w为几,就加到a几,然后输出第i 小的 刚开始用了一个小顶堆,超时,后来看了看别人 ...
- 算法&数据结构系列 -- 堆(优先队列)
前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...
- [luoguP1631] 序列合并(堆 || 优先队列)
传送门 首先,把A和B两个序列分别从小到大排序,变成两个有序队列.这样,从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列: A[1]+B[1] <= A[1]+B[ ...
- P1168 中位数[堆 优先队列]
题目描述 给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3 ...
- 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列
剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...
随机推荐
- Mysql不知道默认密码情况下登录/重置/忘记密码
场景一: 基础系统:linux 镜像:LAMP环境(Ubuntu 18.04 Apache PHP7.0) 问题:ERROR 1405 (28000): Access denied for user ...
- Java 运行 Jar 包中java -cp 与 java jar 的区别
java -cp java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号"; ...
- S7 Linux用户管理及用户信息查询命令
7.1 useradd:创建用户 7.2-5 usermod 7.6 passwd:修改用户密码 7.7-9 chage.chpasswd.su 7.10-11 visudo.sudo 7.12-7. ...
- 简单读读源码 - dubbo多提供者(provider)配置方法
简单读读源码 - dubbo多提供者(provider)配置方法 消费者端dubbo的yml配置 dubbo: consumer: timeout: 300000 protocol: name: du ...
- VMware vRealize Network Insight 6.2 发布 - 网络和安全可视化分析
发现.优化应用安全性和网络连接解决方案并对其进行故障排除 VMware vRealize Network Insight 可帮助您跨混合和多云环境构建经过优化且高度可用的安全网络基础架构.它提供了网络 ...
- Step By Step(Lua函数)
Step By Step(Lua函数) 一.函数: 在Lua中函数的调用方式和C语言基本相同,如:print("Hello World")和a = add(x, y).唯一的 ...
- Nucleus-SE迁移:未实现的设施和兼容性
Nucleus-SE迁移:未实现的设施和兼容性 Nucleus SE migration: Unimplemented facilities and compatibility Nucleus SE的 ...
- mybatis之Param注解
一.作用 使用@Param注解表示给参数命名,名称就是括号中的内容.给参数命名,然后在映射文件中就能根据名称获取参数值了.在mybatis中我们常常要使用到多个参数,但是在xml中的parameter ...
- 【渗透实战】那些年我们遇到的奇葩WAF_第一期_请求方式绕过
/文章作者:Kali_MG1937 CSDN博客:ALDYS4 QQ:3496925334/ 该博文为本人18年左右的渗透记录,文法粗糙,技术含量极低,流水账文章,且今日不知为何被顶上博客首页 为了避 ...
- 『无为则无心』Python基础 — 2、编译型语言和解释型语言的区别
目录 1.什么是计算机语言 2.高级语言中的编译型语言和解释型语言 (1)编译型语言 (2)解释型语言 (3)编译型语言和解释型语言执行流程 3.知识扩展: 4.关于Python 1.什么是计算机语言 ...