TreeMap per index
Time O(log s) set/get, O(1) snap Space O(length + sets)history[i] maps snap id → value (starting with 0 → 0). set writes at the current snap id; snap returns id++; get floors.
SnapshotArray(3); set(0, 5); snap(); set(0, 6); get(0, 0)history(map)
state(vars)
Step 1/5Start: every index has one entry, value 0 from snapshot 0.
import java.util.*;
class SnapshotArray {
private final List<TreeMap<Integer, Integer>> history = new ArrayList<>();
private int snapId = 0;
public SnapshotArray(int length) {
for (int i = 0; i < length; i++) {
TreeMap<Integer, Integer> m = new TreeMap<>();
m.put(0, 0);
history.add(m);
}
}
public void set(int index, int val) { history.get(index).put(snapId, val); }
public int snap() { return snapId++; }
public int get(int index, int snapId) { return history.get(index).floorEntry(snapId).getValue(); }
}Verdict: Memory proportional to changes, not snapshots × length.