
[LeetCode] Smallest Number in Infinite Set

import java.util.*;
class SmallestInfiniteSet {
private PriorityQueue<Integer> pq;
private Set<Integer> hs;
public SmallestInfiniteSet() {
pq = new PriorityQueue<>();
for(int i = 1; i <= 2147483647; i++) {
pq.add(i);
}
hs = new HashSet<>();
}
public int popSmallest() {
int x = pq.poll();
hs.add(x);
return n;
}
public void addBack(int num) {
if(hs.contains(num)) {
hs.remove(num);
pq.add(num);
}
}
}
now 변수를 활용해서 현재 사용하는 숫자만 관리한다.now 값을 반환하고, 그렇지 않으면 큐에서 가장 작은 값을 반환한다.now보다 작은 값을 반환한다.class SmallestInfiniteSet {
private PriorityQueue<Integer> pq;
private int now;
public SmallestInfiniteSet() {
pq = new PriorityQueue<>();
now = 1;
}
public int popSmallest() {
if (!pq.isEmpty()) {
return pq.poll();
}
return now++;
}
public void addBack(int num) {
if (num < now && !pq.contains(num)) {
pq.offer(num);
}
}
}
num의 범위가 1000 이하인 양의 정수이므로 notAdded는 크기는 1001notAdded를 순회해 false인 값을 찾아서 now에 저장하고 반환한다.notAdded 값을 false로 반환하고, num과 now 중 작은 값을 now에 저장한다.class SmallestInfiniteSet {
int now;
boolean[] notAdded;
public SmallestInfiniteSet() {
now = 1;
notAdded = new boolean[1001];
}
public int popSmallest() {
for(int i = now; i < 1001; i++){
if(!notAdded[i]) {
now = i;
notAdded[i] = true;
break;
}
}
return now;
}
public void addBack(int num) {
notAdded[num] = false;
now = Math.min(num, now);
}
}