주제 설명
스택의 데이터 구조를 정의하십시오. 스택에 포함 된 가장 작은 요소를 가져올 수있는 최소 함수를이 유형으로 구현하십시오 (시간 복잡도는 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();
}
}