LeetCode 855. Exam Room
原题链接在这里:https://leetcode.com/problems/exam-room/
题目:
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1.
When a student enters the room, they must sit in the seat that maximizes the distance to the closest person. If there are multiple such seats, they sit in the seat with the lowest number. (Also, if no one is in the room, then the student sits at seat number 0.)
Return a class ExamRoom(int N) that exposes two functions: ExamRoom.seat() returning an int representing what seat the student sat in, and ExamRoom.leave(int p) representing that the student in seat number p now leaves the room. It is guaranteed that any calls to ExamRoom.leave(p) have a student sitting in seat p.
Example 1:
Input: ["ExamRoom","seat","seat","seat","seat","leave","seat"], [[10],[],[],[],[],[4],[]]
Output: [null,0,9,4,2,null,5]
Explanation:
ExamRoom(10) -> null
seat() -> 0, no one is in the room, then the student sits at seat number 0.
seat() -> 9, the student sits at the last seat number 9.
seat() -> 4, the student sits at the last seat number 4.
seat() -> 2, the student sits at the last seat number 2.
leave(4) -> null
seat() -> 5, the student sits at the last seat number 5.
Note:
1 <= N <= 10^9ExamRoom.seat()andExamRoom.leave()will be called at most10^4times across all test cases.- Calls to
ExamRoom.leave(p)are guaranteed to have a student currently sitting in seat numberp.
题解:
It is clear to find the bigest interval and assign the middle position back.
Use TreeSet ts to maintain intervals sorted by the distance of interval. At the begining, put a dummy interval into ts.
When calculating the distance of interval, divide by 2. Because it only puts value to its closest.
e.g. N = 10. First 3 seats return 0, 9, 4. Now there are 3 seats between [0,4], and 4 seats between [4,9].
But next seat returns 2 in [0,4], but not 6 in [4,9]. Since 2-0 equals to 2, 6-4 still equals to 2.
And since there are dummy interval, when interval[0] == -1, simple return interval[1]. when interval[1] == N, simple return N-interval[0]-1.
Also have 2 maps to maintain mapping between startpoint and interval, endpoint and interval.
For leave(int p), get the left interval with endMap on p. and right interval with startMap on p.
Merge left and right interval and add merged interval back.
Time Complexity: seat, O(logn). leave, O(logn). n is count of intervals in ts.
Space: O(n).
AC Java:
class ExamRoom {
int N;
TreeSet<int []> ts;
HashMap<Integer, int []> startMap;
HashMap<Integer, int []> endMap;
public ExamRoom(int N) {
this.N = N;
ts = new TreeSet<>((a,b) -> {
if(dist(b) == dist(a)){
return a[0] - b[0];
}
return dist(b) - dist(a);
});
startMap = new HashMap<>();
endMap = new HashMap<>();
add(new int[]{-1, N});
}
public int seat() {
int [] top = ts.pollFirst();
int pos = 0;
if(top[0] == -1){
pos = 0;
}else if(top[1] == N){
pos = N-1;
}else{
pos = top[0] + (top[1]-top[0])/2;
}
add(new int[]{top[0], pos});
add(new int[]{pos, top[1]});
return pos;
}
public void leave(int p) {
int [] left = endMap.get(p);
int [] right = startMap.get(p);
int [] merged = new int[]{left[0], right[1]};
remove(left);
remove(right);
add(merged);
}
private int dist(int [] interval){
if(interval[0] == -1){
return interval[1];
}
if(interval[1] == N){
return N-interval[0]-1;
}
return (interval[1]-interval[0])/2;
}
private void add(int [] interval){
ts.add(interval);
startMap.put(interval[0], interval);
endMap.put(interval[1], interval);
}
private void remove(int [] interval){
ts.remove(interval);
startMap.remove(interval[0]);
endMap.remove(interval[1]);
}
}
/**
* Your ExamRoom object will be instantiated and called as such:
* ExamRoom obj = new ExamRoom(N);
* int param_1 = obj.seat();
* obj.leave(p);
*/
LeetCode 855. Exam Room的更多相关文章
- [LeetCode] 855. Exam Room 考场
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1. When a student enter ...
- 【LeetCode】855. Exam Room 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/exam-roo ...
- 855. Exam Room
维护一个数据结构要满足:一个教室线性排列的座位 0 ... N-1 调用seat 入座一个距离最近学生最远的座位 调用leave x 离座一个位置为x的学生 由于N最多是 10e9 所以选择维护 学生 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- [LeetCode] Exam Room 考试房间
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1. When a student enter ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- [LeetCode] Maximize Distance to Closest Person 离最近的人的最大距离
In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...
- [Swift]LeetCode855. 考场就座 | Exam Room
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1. When a student enter ...
- leetcode动态规划题目总结
Hello everyone, I am a Chinese noob programmer. I have practiced questions on leetcode.com for 2 yea ...
随机推荐
- 怎样使用U盘安装系统
准备工作 一个8G及以上的U盘: 软碟通UltraISO,下载地址,非免费,但试用就够了: 系统镜像,推荐去MSDN下载: 安装过程 利用U盘制作启动盘,准备好上述的东西,然后开始制作启动盘: 注意: ...
- Jenkins服务使用 宿主机的docker、docker-compose (Jenkins 执行sudo命令时出现“sudo: no tty present and no askpass program specified”,以及 docker-compose command not found解决办法)
若要转载本文,请务必声明出处:https://www.cnblogs.com/zhongyuanzhao000/p/11681474.html 原因: 本人最近正在尝试CI/CD,所以就使用了 Jen ...
- sublime配置python环境及快捷键
sublime配置python环境 参考链接:https://blog.csdn.net/VertigozZ/article/details/54574006 快捷键的配置:https://www.c ...
- Harbor 开机自启遇到的问题
Harbor 是一个企业级的 Docker 私有仓库项目,它本身由多个 Docker Containers 组成,通过 docker-compose 管理 containers 之间的依赖关系. 安装 ...
- centos 6.5安装zabbix 4.4
一.安装环境 本环境,使用单机部署. 操作系统:centos 7.5 x64zabbix-server,Mysql,php,nginx都在同一台服务器.都是使用Yum安装的! 官方安装文档: http ...
- -Gradle 翻译 Merge AndroidManifest 合并清单文件 MD
目录 目录 Merge AndroidManifest 合并清单文件 合并多个清单文件 合并优先级 合并冲突启发式算法 合并规则的标记 节点标记 属性标记 Attribute markers 标记选择 ...
- MMKV 多进程K-V组件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Java web服务端参数校验Javax.validation (springboot)
一.基本使用 Javax.validation是spring集成自带的一个参数校验接口.可通过添加注解来设置校验条件. 下面以springboot项目为例进行说明.创建web项目后,不需要再添加其他的 ...
- this指向详解及改变它的指向的方法
一.this指向详解(彻底理解js中this的指向,不必硬背) 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是 ...
- 浏览器Notwork XHR被隐藏了
图片中红色区域内容被隐藏 解决方式,点击此处