문제 링크: https://leetcode.com/problems/min-stack/?envType=study-plan-v2&envId=top-interview-150
아래를 지원하는 stack을 설계하자.
각 함수는 O(1)의 시간 복잡도를 가져야 한다.
여기서 가장 중요한 포인트는 getMin, 스택의 최소 요소 검색을 O(1)의 시간 복잡도로 수행해야 한다는 점이다.
스택의 최소 요소 검색을 구현하려면 어떻게 해야할까?
class MinStack {
Node head;
class Node {
int min;
int val;
Node next;
Node(int min, int val, Node next) {
this.min = min;
this.val = val;
this.next = next;
}
}
public MinStack() {
head = null;
}
public void push(int val) {
int min = (head==null) ? val : head.min;
Node newNode = new Node(Math.min(min, val), val, head);
head = newNode;
}
public void pop() {
if (head.next == null || head == null) {
head = null;
return;
}
head = head.next;
}
public int top() {
return head.val;
}
public int getMin() {
return head.min;
}
}
class MinStack {
private Node head;
public void push(int x) {
if (head == null)
head = new Node(x, x, null);
else
head = new Node(x, Math.min(x, head.min), head);
}
public void pop() {
head = head.next;
}
public int top() {
return head.val;
}
public int getMin() {
return head.min;
}
private class Node {
int val;
int min;
Node next;
private Node(int val, int min, Node next) {
this.val = val;
this.min = min;
this.next = next;
}
}
}
이 풀이가 leetcode에서 Java로 작성한 풀이 중 가장 극찬을 받고 있는 코드였다. 나와 비슷한 코드긴 하지만, 한 가지 더 간결하게 작성한 부분인 pop()
이 다르다.
아래와 같은 조건을 놓쳤기 때문이다.
• Methods pop, top and getMin operations will always be called on **non-empty** stacks.
pop, top, getMin 함수는 스택이 비어있을 때 호출되지 않는다는 조건이다. top과 getMin은 봤는데, pop을 놓쳤었다.
코테에서는 조건도 정말 꼼꼼히 다 읽어봐야 한다. 하나의 조건 유무 또한 코드에 큰 영향을 미칠 수 있다.