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 ...
随机推荐
- 大数据之路【第十篇】:kafka消息系统
一.简介 1.简介 简 介• Kafka是Linkedin于2010年12月份开源的消息系统• 一种分布式的.基于发布/订阅的消息系统 2.特点 – 消息持久化:通过O(1)的磁盘数据结构提供数据的持 ...
- 部署.Net Core APi+Vue 到 linux centos 服务器(一)
部署.Net Core APi+Vue 到 linux centos 服务器(一) 前言:项目采用的是 .net core 作为接口,vue作为前端. 此时需要把整个项目架设到linux centos ...
- 「UR#6」懒癌
「UR#6」懒癌 妈妈我居然看了六个小时题解,快救救乌干达的可怜儿童吧. 接下来开始膜官方题解: 其实就算有上面两个结论也不是很好想到任意复杂度的做法,关键在于要想到一个人是怎么推断自己的狗是不是 ...
- jedis异常:Could not get a resource from the pool
前几天公司后端系统出现了故障,导致app多个功能无法使用,查看日志,发现日志出现较多的redis.clients.jedis.exceptions.JedisConnectionException: ...
- mybatis使用foreach处理List中的Map mybatis-----传入传出多个参数,都是map或list,批量更新
https://nannan408.iteye.com/blog/2170470 https://blog.csdn.net/xingzhishen/article/details/86424395 ...
- linq根据英文首字母姓名排序
names.Sort((a, b) => a.name.CompareTo(b.name));
- Matlab建造者模式
构建者模式又叫建造者模式(Builder),是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继 ...
- SQL Injection (Blind)
Low级别基于布尔的盲注思路 1.判断是否存在注入,注入是字符型还是数字型 2.猜解当前数据库名 3.猜解数据库中的表名 4.猜解表中的字段名 5.猜解数据 判断是否有sql注入 输入1.1’ and ...
- pandas-08 pd.cut()的功能和作用
pandas-08 pd.cut()的功能和作用 pd.cut()的作用,有点类似给成绩设定优良中差,比如:0-59分为差,60-70分为中,71-80分为优秀等等,在pandas中,也提供了这样一个 ...
- JAVA基础之会话技术-Cookie及Session
至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...