【剑指Offer】020——包含min函数的栈 (栈)
2019-08-18 本文已影响0人
就问皮不皮
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数(时间复杂度应为O(1))。
解题思路
用一个栈stack保存数据,用另外一个栈temp保存依次入栈最小的数
比如,stack中依次入栈
5, 3, 4, 10, 2, 12, 1, 8
则temp依次入栈
5, 3, 3,3, 2, 2, 1, 1
每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈,否则用最小元素入栈。
参考代码
Java
import java.util.Stack;
public class Solution {
Stack<Integer> stack = new Stack<>();
Stack<Integer> help = new Stack<>(); // 辅助栈
int min = Integer.MAX_VALUE; //边界值
public void push(int node) { // 压栈方法
stack.push(node);
// 获取最小值
if (node < min) {
help.push(node);
min = node;
} else {
// 第一次入栈
if (stack.isEmpty()) {
min = node;
help.push(node);
} else {
help.push(min); // 压入上一次的最小值
}
}
}
// 出栈方法
public void pop() {
if (stack.isEmpty()) {
throw new RuntimeException("stack is none");
} else { // 同时弹出
stack.pop();
help.pop();
}
}
// 获取栈顶值
public int top() {
int t = stack.pop();
help.pop();
return t;
}
// 获取当前栈最小值
public int min() {
int m = help.pop();
help.push(m);
return m;
}
}
Python
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack=[]
self.helper = []
def push(self, node):
self.stack.append(node)
# 判断为空
if not self.helper or node <= self.helper[-1]:
self.helper.append(node)
else:
self.helper.append(self.helper[-1])
def pop(self):
if self.stack:
self.stack.pop()
self.helper.pop()
def top(self):
return self.stack[-1]
def min(self):
return self.helper[-1]
个人订阅号
image