1、题目描述
2、解题思路
初始化:定义一个 TreeSet 存储已经占有的座位号,该数据结构会自动从小到大排序;
seat:
1)定义一个全局最优位置pos;
2)每两两相间的已占座位号为一个区间,每一个区间都存在唯一的局部最优位置,即区间的中心位置。每一个局部最优位置都有一个“与离他最近的人之间的距离最大值”,即区间大小除以 2 取整;
3)找到“与离他最近的人之间的距离最大值”最大的局部左右位置即为全局最优位置。
leave:
直接数据结构调用remove方法,该数据结构会重新调整为从小到大排序。
3、解题代码
import java.util.TreeSet;
/**
* @ProjectName: Practices
* @Author: Meumax
* @Description:
* @CreateTime: 2021-09-26 18:04:12
**/
class ExamRoom {
int N;
TreeSet<Integer> set; // 存储已经使用的座位
public ExamRoom(int N) {
this.N = N;
set = new TreeSet<Integer>();
}
public int seat() {
int pos = 0; // 全局最优位置
if (set.size() > 0) {
int distance = set.first(); // 两两已占座位的间距
Integer pre = null; // 上一个已占座位号
for (Integer cur : set) { // 遍历已占座位号
if (pre != null) {
int d = (cur - pre) / 2; // 局部最优位置
if (d > distance) { // 更新全局最优位置
distance = d;
pos = pre + d;
}
}
pre = cur;
}
if (N - 1 - set.last() > distance)
pos = N - 1;
}
set.add(pos);
return pos;
}
public void leave(int p) {
set.remove(p);
}
}
/**
* Your ExamRoom object will be instantiated and called as such:
* ExamRoom obj = new ExamRoom(n);
* int param_1 = obj.seat();
* obj.leave(p);
*/