Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- MinStack() initializes the stack object.
- void push(int val) pushes the element val onto the stack.
- void pop() removes the element on the top of the stack.
- int top() gets the top element of the stack.
- int getMin() retrieves the minimum element in the stack.
You must implement a solution with O(1) time complexity for each function.
pop() 그리고 push()마다 최솟값을 업데이트, push는 구현이 어렵지 않으나 pop()이 문제였다.
스택에 매 요소마다 최솟값을 같이 저장해주면 쉽게 해결할 수 있다.
3개의 요소가 들어가 있는 경우를 예시로 들면
idx: 0 = 1번 인덱스까지의 최솟값
idx: 1 = 첫 번째 element
idx: 2 = 3번 인덱스까지의 최솟값
idx: 3 = 두 번째 element
idx: 4 = 5번 인덱스까지의 최솟값
idx: 5 = 세 번째 element
stack.pop()은 첫 번째 요소를 pop한다 즉, stack에 push한 경우 0번 인덱스부터 들어온다.
import java.util.LinkedList;
class MinStack {
LinkedList<Integer> stack = new LinkedList<>();
public MinStack() {
}
public void push(int val) {
if (stack.isEmpty())
{
stack.push(val);
}
else
{
stack.push(Math.min(stack.get(1), val));
}
stack.push(val);
}
public void pop() {
stack.pop();
stack.pop();
}
public int top() {
return stack.get(0);
}
public int getMin() {
return stack.get(1);
}
}
/*
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/