Advertisement
855. Exam Room
UnknownView on LeetCode
855.cs
C#
public class Node
{
public Node prev;
public Node next;
public int value;
public Node(int value)
{
this.value = value;
}
}
public class ExamRoom
{
int n;
Node head = new Node(-1);
Node tail = new Node(-1);
Dictionary<int, Node> map = new Dictionary<int, Node>();
public ExamRoom(int n)
{
this.n = n;
Join(head, tail);
}
public int Seat()
{
if (head.next == tail)
{
Node node = new Node(0);
Join(head, node);
Join(node, tail);
map[0] = node;
return 0;
}
int prevStudent = -1;
int maxDistToClosest = 0;
int val = 0;
Node pos = null;
for (Node node = head; node != tail; node = node.next)
{
if (prevStudent == -1)
{
maxDistToClosest = node.value;
pos = node;
}
else if ((node.value - prevStudent) / 2 > maxDistToClosest)
{
maxDistToClosest = (node.value - prevStudent) / 2;
val = (node.value + prevStudent) / 2;
pos = node;
}
prevStudent = node.value;
}
if (n - 1 - tail.prev.value > maxDistToClosest)
{
pos = tail;
val = n - 1;
}
Node insertedNode = new Node(val);
Join(pos.prev, insertedNode);
Join(insertedNode, pos);
map[val] = insertedNode;
return val;
}
public void Leave(int p)
{
Node removedNode = map[p];
Join(removedNode.prev, removedNode.next);
map.Remove(p);
}
private void Join(Node node1, Node node2)
{
node1.next = node2;
node2.prev = node1;
}
private void Remove(Node node)
{
Join(node.prev, node.next);
}
}Advertisement