题目描述
相信我,每一个人内在都是有精神洁癖的。尤其是在题目所在的场景中。
下面我们就用一个算法来衡量一下!!!
在考场里,一排有 N 个座位,分别编号为 0, 1, 2, …, N-1 。
当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在
0 号座位上。)返回 ExamRoom(int N) 类,它有两个公开的函数:其中,函数 ExamRoom.seat() 会返回一个 int
(整型数据),代表学生坐的位置;函数 ExamRoom.leave(int p) 代表坐在座位 p 上的学生现在离开了考场。每次调用
ExamRoom.leave§ 时都保证有学生坐在座位 p 上。
这是leetcode上面的原题,但是其实和男厕所小便更加贴切!!!
题目分析
首先这是一个数据结构设计的问题。
数据结构的意义并不在于简单的存储,而在于高效的存储。
那么如何实现高效的存储呢?
通过一些计算维护一个较为容易提取的结构
我们发现写出adt是很简单的。
然后我们来看看具体的分类情况。
最复杂的就是找出最大的间隔然后求一半。相当于站在最大的空档的中间。
但是这样的话复杂度是比较高的。没有达到我们数据结构的目的,高效的存储。
所以我们要用到哈希表,维护一个状态,从而轻松的找到最大的区间。
详细代码
from sortedcontainers import SortedList
class ExamRoom:
def __init__(self, n: int):
def dist(x):
l, r = x
return r - l - 1 if l == -1 or r == n else (r - l) >> 1
self.n = n
self.ts = SortedList(key=lambda x: (-dist(x), x[0]))
self.left = {}
self.right = {}
self.add((-1, n))
def seat(self) -> int:
s = self.ts[0]
p = (s[0] + s[1]) >> 1
if s[0] == -1:
p = 0
elif s[1] == self.n:
p = self.n - 1
self.delete(s)
self.add((s[0], p))
self.add((p, s[1]))
return p
def leave(self, p: int) -> None:
l, r = self.left[p], self.right[p]
self.delete((l, p))
self.delete((p, r))
self.add((l, r))
def add(self, s):
self.ts.add(s)
self.left[s[1]] = s[0]
self.right[s[0]] = s[1]
def delete(self, s):
self.ts.remove(s)
self.left.pop(s[1])
self.right.pop(s[0])