Sword는 min 함수를 포함하는 브러시 질문 -GZ20-stack 제공을 나타냅니다.

주제 설명
스택의 데이터 구조를 정의하십시오. 스택에 포함 된 가장 작은 요소를 가져올 수있는 최소 함수를이 유형으로 구현하십시오 (시간 복잡도는 O (1)이어야 함).
문제 해결 아이디어 :
이 문제를보고 처음에는 가장 작은 요소를 저장할 멤버 변수를 추가하고 스택을 푸시 할 때마다 푸시 된 요소가 현재 가장 작은 요소보다 작 으면 가장 작은 요소
업데이트됩니다. . 작은 요소가 팝업되어있는 경우 그러나 이것은, 어떻게 다음 작은 요소를 질문 거기에 도착하는 것입니다 것인가? 단지 멤버 변수를 추가하는 가장 작은 요소를 저장하는 것으로 분석에서 찾을 수 있습니다 충분하지 않습니다. 우리는 필요 가장 작은 요소가 팝업 후 다음 작은 요소를 얻을. 다음 후
작은 요소가 튀어되어
, 당신은 얻을 수 있습니다 다음 작은 요소 . 따라서, 이러한 요소를 저장하기 위해 다른 스택을 사용하는 것이 더 적절하다. 우리는 가장 작은 요소 전화 스택을 누를 때마다 스택 요소가 현재 가장 작은 요소보다 작습니다.이 요소를 가장 작은 요소 스택으로 밀어 넣으면 원래 가장 작은 요소가 두 번째로 작은 요소가됩니다. 마찬가지로 스택을 팝할 때 팝된 요소가 가장 작은 요소 스택의 맨 위 요소와 같으면 가장 작은 요소 스택의 맨 위를 팝합니다.

import java.util.Stack;

public class Solution {
    
    
    /**
     解题思路:
         创建一个用来保存最小元素的栈stackMin。
     stack要入栈时:入栈元素node每次都和stackMin中的栈顶元素比较,如果比stackMin中的最小元素小
            那么就将node入stackMin栈。否则只入stack栈。
     stack要出栈时:每次都和stackMin栈中的栈顶元素比较,如果相等,那么说明stack中的最小元素出栈了,
            那么,stackMin中的栈顶元素也要出栈。这样就保证了stackMin中的栈顶元素一定是stack中的
            最小元素
    */
    private Stack<Integer> stack = new Stack<>();
    private Stack<Integer> stackMin = new Stack();
    public void push(int node) {
    
    
        stack.push(node);
        if(stackMin.empty()){
    
    //如果最小元素栈为空就将这个元素添加进去
            stackMin.push(node);
        } else if(node < stackMin.peek()){
    
    //如果当前要入栈的元素小于stackMin的栈顶元素,那么就push
            stackMin.push(node);
        }
    }
    
    public void pop() {
    
    
        if(stack.peek().equals(stackMin.peek())){
    
    
            stackMin.pop();
        }
        stack.pop();
    }
    
    public int top() {
    
    
        return stack.peek();//查看栈顶元素
    }
    
    public int min() {
    
    
        return stackMin.peek();
    }
}

추천

출처blog.csdn.net/weixin_42118981/article/details/113065005