力扣855题(考场就座)

855、考场就座

基本思想:

将每两个相邻考生看成线段的两个端点,新安排考生就是找最长的线段,然后让该考生在中间把这个线段‘二分’,重点就是给他分配的位置。

看不懂的时候自己动手写一个例子

代码:

class ExamRoom(object):
    def __init__(self, N):
        self.N = N
        self.students = []

    def seat(self):
        if not self.students:
            student = 0
        else:
            #dist距离最近的学生的距离
            #从最左边的位置开始
            dist, student = self.students[0], 0
            for i, s in enumerate(self.students):
                if i:
                    prev = self.students[i-1]
                    # 每一对相邻学生的位置 (prev, s),
                    # prev + d位置是新来的学生.
                    d = (s - prev) // 2 # 计算待插入student与相邻student的距离
                    if d > dist:
                        dist, student = d, prev + d

            # 考虑最右边的位置
            d = self.N - 1 - self.students[-1]
            if d > dist:
                student = self.N - 1

        # Add the student to our sorted list of positions.
        bisect.insort(self.students, student)
        return student

    def leave(self, p):
        if p in self.students:
            self.students.remove(p)
原文地址:https://www.cnblogs.com/zhaojiayu/p/15216731.html