题目:
在考场里,一排有 N 个座位,分别编号为 0, 1, 2, …, N-1 。
当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在 0 号座位上。)
返回 ExamRoom(int N) 类,它有两个公开的函数:其中,函数 ExamRoom.seat() 会返回一个 int(整型数据),代表学生坐的位置;函数 ExamRoom.leave(int p) 代表坐在座位 p 上的学生现在离开了考场。每次调用ExamRoom.leave(p)时都保证有学生坐在座位 p 上。
示例1:
输入:[“ExamRoom”,“seat”,“seat”,“seat”,“seat”,“leave”,“seat”],
[[10],[],[],[],[],[4],[]]
输出:[null,0,9,4,2,null,5]
解释: ExamRoom(10) ->null
seat() -> 0,没有人在考场里,那么学生坐在 0 号座位上。
seat() -> 9,学生最后坐在 9 号座位上。
seat() -> 4,学生最后坐在 4 号座位上。
seat() -> 2,学生最后坐在 2 号座位上。
leave(4) -> null
seat() -> 5,学生最后坐在 5 号座位上。
简单介绍:
题目:考场就座
题目难度:中等
使用语言:JAVA。
这道题来自leetcode题库的Ordered Map标签。
如果想要加深对java拥有数据结构类型的理解,特别是Map的理解,做这类型的题是提升很快的。
解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.找到距离最远且编号最小的位置
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用,保存学生的就座情况
这里有两种方法,分别是顺序的List表和TreeSet。
在这里我们采用TreeSet,变量命名为Students。
因为TreeSet是按键从小到大排序的,而JAVA对TreeSet的封装比较好。
算法:
既然明确了TreeSet作为解决该题的数据结构,我们就可以开始我们的算法分析了。
1.遍历students,比较每个区间的中点,取得最远且编号最小的点。
2.考虑位置在0侧和N-1侧的情况。
代码部分:
public class ExamRoom {
int N;
TreeSet<Integer> students;
public ExamRoom(int N) {
this.N=N;
students=new TreeSet<>();
}
//返回距离最远的编号最小空位
public int seat() {
int student = 0;//学生的位置,默认0
if(students.size()>0) {//学生表非空
int dist=students.first();//起始位置为0
Integer prv=null;//区间的左边界
for(Integer s:students) {
if(prv!=null)
{
int d=(s-prv)/2;
if(d>dist) {
dist=d;
student=prv+d;
}
}
prv=s;
}
if(N-1-students.last()>dist) {//如果N-1位置没有人,则返回N-1
student=N-1;
}
}
students.add(student);
return student;
}
public void leave(int p) {
students.remove(p);//移除P号学生
}
}
结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!