알고리즘

[Stack] Min Stack

point_Man 2023. 8. 31. 22:13

최소 스택

 

Min Stack - LeetCode

Can you solve this real interview question? Min Stack - Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. Implement the MinStack class: * MinStack() initializes the stack object. * void push(int val) pushes t

leetcode.com

푸시, 팝, 상단 및 일정한 시간에 최소 요소 검색을 지원하는 스택을 설계합니다.

클래스를 구현합니다 MinStack.

  • MinStack()스택 개체를 초기화합니다.
  • void push(int val)요소를 val스택에 푸시합니다.
  • void pop()스택 맨 위에 있는 요소를 제거합니다.
  • int top()스택의 최상위 요소를 가져옵니다.
  • int getMin()스택에서 최소 요소를 검색합니다.

O(1)각 기능에 대해 시간 복잡도가 있는 솔루션을 구현해야 합니다 .

 

예시 1:

입력 
["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[- 
3 ],[],[],[],[]] 출력 
[null,null,null,null,-3,null,0,-2] 설명 
MinStack minStack = new MinStack(); 
minStack.push(-2); 
minStack.push(0); 
minStack.push(-3); 
minStack.getMin(); // -3을 반환합니다. 
minStack.pop(); 
minStack.top(); // 0을 반환합니다. 
minStack.getMin(); // -2를 반환




 

제약:

  • -2^31 <= val <= 2^31 - 1
  • 메서드 pop및 작업 top은 항상 비어 있지 않은getMin 스택 에서 호출됩니다 .
  • 대부분의 호출은 , ,  으로 이루어집니다 .3 * 10^4 push/pop/top/getMin

1.첫번째 시도

class MinStack {

    int top = -1;
    ArrayList<Integer> stack = new ArrayList<>(); 
    ArrayList<Integer> minStack = new ArrayList<>();

    public MinStack() {
        
    }
    
    public void push(int val) {
        stack.add(val);
        if(top==-1){
            minStack.add(val);
        }else{
            minStack.add( Math.min(minStack.get(top),val));
        }
       
        top++;
    }
    
    public void pop() {
        stack.remove(top);
        minStack.remove(top);

        top--;
    }
    
    public int top() {
        return stack.get(top);
    }
    
    public int getMin() {
        return minStack.get(top);
    }
}

/**
 * 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();
 */

자료구조 스택을 구현하는 문제였습니다.

스택의 특성은 LIFO(last in fisrt out) 늦게 들어온 스택이 가장먼저 나간다는 특징을 가지고 있습니다.

top 이라는 포인터를 사용하여 초기 값은 -1로 시작하여

push() 할 때마다 top++ 하여 포인터를 한칸씩 이동시킨다.

pop() 할 때마다 top--하여 포인터를 한칸씩 뒤로 이동 시킨다.

top()은 스택에 가장 위에 값을 확인 하기 위해 현재 포인터 top에 값을 반환한다.

이렇게 쉽게 스택 자료구조를 구현 할 수 있지만 getMin() 현재 스택의 값중 가장 작은 값을 반환하라는

요구사항이 있습니다. 

최소값을 구하기 위해 minStack을 사용하여 push할때마다 Math.min() 사용하여 최소값을 가지는 스택을 따로 구현하였습니다

push()할 때 stack과 minStack에 배열에 각자 역할이 다른 데이터들이 저장하게되고

pop()또한 같이 데이터가 삭제되어 현재 stack의 최소값을 확인 할 수 있었다. 

이렇게 문제를 해결 하였을때의 시간복잡도 O(1), 공간복잡도 O(n)+O(n)+O(n) = O(3n) = O(n)로 나왔습니다.

 

'알고리즘' 카테고리의 다른 글

[Hash Table] Ransom Note  (0) 2023.09.01
[Hash Table] Two Sum  (0) 2023.08.31
[Binary Search] Search Insert Position  (0) 2023.08.28
[Linked List] Linked List Cycle  (0) 2023.08.28
[Two Pointers] Valid Palindrome  (0) 2023.08.28