算法思想一:定义辅助栈
解题思路:
1、要用两个栈,stack用于存储元素,mins用于存储最小值,每个位置的元素都有一个对应的最小值,也就是stack和mins的长度同步增加和减少;当需要得到目前栈中的最小值的时候,直接返回mins的栈顶元素即可
2、在mins栈中先添加一个最大值,因为以后每次添加都会和栈顶元素比较,如果栈为空的话代码要多写几行,先放一个最大值会方便一点
2、在mins栈中先添加一个最大值,因为以后每次添加都会和栈顶元素比较,如果栈为空的话代码要多写几行,先放一个最大值会方便一点
代码展示:
Python版本
# -*- coding:utf-8 -*- class Solution: def __init__(self): """ initialize your data structure here. """ self.stack = [] self.mins = [float("inf")] def push(self, node): # write code here self.stack.append(node) self.mins.append(min(self.mins[-1], node)) def pop(self): # write code here self.stack.pop() self.mins.pop() def top(self): # write code here return self.stack[-1] def min(self): # write code here return self.mins[-1]
复杂度分析:
时间复杂度O(1):栈的入、出时间均为O(1)
空间复杂度O(N):辅助栈空间,最差情况辅助站存储元素n个
算法思想二:基于链表
解题思路:
两个List一个存放存取的东西,一个存放截至到当前下标的最小值:1.入栈一个数字就入栈一个当前位置最小值;
2.出栈一个数字就出栈尾位置最小值;
代码展示:
JAVA版本
import java.util.List; import java.util.ArrayList; public class Solution { // 存储最小元素数组 Listmin = new ArrayList(); // 存储入栈数组 Listnum = new ArrayList(); public void push(int node) { num.add(node); // 判断最小值存入min数组 if(min.size() == 0 || node < min.get(min.size() - 1)) min.add(node); else min.add(min.get(min.size() - 1)); } public void pop() { num.remove(num.size() - 1); min.remove(min.size() - 1); } public int top() { // 获取最后一个元素 return num.get(num.size() - 1); } public int min() { return min.get(min.size() - 1); } }
复杂度分析:
时间复杂度O(1):链表的添加和删除时间为O(1)
空间复杂度O(N):辅助数组空间,最差情况下链表存储n个元素