1756. Design Most Recently Used Queue
in Coding Interview on Design, Binary Search
가장 최근에 사용한 요소를 대기열의 끝으로 이동시키는 데이터 구조를 설계
class MRUQueue {
Node[] nodes;
int bucket;
// 가장 최근에 사용된 대기열
public MRUQueue(int n) {
bucket = (int) Math.sqrt(n);
nodes = new Node[(n+bucket - 1) / bucket];
Arrays.asList(nodes).replaceAll(i->new Node(-1));
for (int i = 1; i <= n;++i) {
nodes[(i - 1) / bucket].pre.append(new Node(i));
}
}
public int fetch(int k) {
var ans = nodes[--k/bucket].nxt;
for (int i = k % bucket; i > 0; --i) { //seek to target inside bucket
ans = ans.nxt;
}
ans.remove();
for (int i = 1 + k / bucket; i < nodes.length; ++i) { //rebalance
nodes[i - 1].pre.append(nodes[i].nxt.remove());
}
nodes[nodes.length - 1].pre.append(ans);
return ans.val;
}
static class Node {
Node pre = this, nxt = this;
int val;
Node (int v) {
val = v;
}
void append(Node node){
var tmp = nxt;
nxt = node;
node.pre = this;
node.nxt = tmp;
tmp.pre = node;
}
Node remove() {
pre.nxt = nxt;
nxt.pre = pre;
return nxt = pre = this;
}
}
}
/**
* Your MRUQueue object will be instantiated and called as such:
* MRUQueue obj = new MRUQueue(n);
* int param_1 = obj.fetch(k);
*/