算法思想一:定义辅助栈
解题思路:
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个元素



京公网安备 11010502036488号