Problem solution · Java

Exam Room

Exam Room: a Java solution using hash-based lookup. Learn the idea, check the complexity, and read the full code, with credit to walkccc LeetCode Solutions.

Technique
Hash-based lookup
Source
walkccc LeetCode Solutions
Length
75 lines
Start with the idea.

Try the problem first. If you get stuck, read the approach below, then write your own solution. The full code is at the bottom.

Approach

Hash-based lookup

For Exam Room, the implementation stores previously seen values or frequencies in a hash table for direct membership and lookup operations.

  1. Decide the key that represents the information needed later.
  2. Update its count or stored state while scanning the input.
  3. Use constant-time expected lookups to detect matches or assemble the result.

Code notes

  • 75 lines of Java from the credited upstream file 855.java.
  • The implementation visibly relies on hash lookup, ordered lookup.
  • 1 loop block detected.

Complexity

Expected hash operations are constant time, but the surrounding scan and the number of stored keys determine total work and memory.

Check the problem constraints before deciding whether this complexity will pass.

Source

Code and credit

This code comes from walkccc LeetCode Solutions by P.-Y. Chen (walkccc) and is used under the MIT licence.

Full codeExam Room · JavaJava
Use this to learn the idea, then write your own version.
class Node {  public Node prev;  public Node next;  public int value;   public Node(int value) {    this.value = value;  }} class ExamRoom {  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.put(0, node);      return 0;    }     int prevStudent = -1;    int maxDistToClosest = 0;    int val = 0;     // the inserted value    Node pos = null; // the inserted position     for (Node node = head; node != tail; node = node.next) {      if (prevStudent == -1) {         // We haven't insert anything before.        maxDistToClosest = node.value; // the distance between it and the begining        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.put(val, insertedNode);    return val;  }   public void leave(int p) {    Node removedNode = map.get(p);    join(removedNode.prev, removedNode.next);  }   private int n;  private Node head = new Node(-1);  private Node tail = new Node(-1);  private Map<Integer, Node> map = new HashMap<>(); // {p: student iterator}   private void join(Node node1, Node node2) {    node1.next = node2;    node2.prev = node1;  }   private void remove(Node node) {    join(node.prev, node.next);  }} 

Did this explanation save you time? I'm a Grade 11 student building this free library to make difficult algorithms easier to understand.

Buy me a coffee ↗