class MinStack {
List<Integer> list;
//辅助栈
List<Integer> minlist;
int min;
public MinStack() {
list = new ArrayList<>();
minlist = new ArrayList<>();
}
public void push(int x) {
list.add(x);
if (list.size() == 1) {
min = x;
} else {
min = min > x ? x:min;
}
minlist.add(min);
}
public void pop() {
list.remove(list.size() -1);
minlist.remove(minlist.size() -1);
if (minlist.size() >0){
min = minlist.get(minlist.size() -1);
}
}
public int top() {
return list.get(list.size() - 1);
}
public int min() {
return minlist.get(minlist.size() - 1);
}
}
class MinStack {
int N = 20010;
int[] minS = new int[N], s = new int[N];
int topM = -1, top = -1;
/** initialize your data structure here. */
public MinStack() {
minS[++topM] = Integer.MAX_VALUE;
}
public void push(int x) {
s[++top] = x;
int t = Math.min(x, minS[topM]);
minS[++topM] = t;
}
public void pop() {
--top;
--topM;
}
public int top() {
return s[top];
}
public int min() {
return minS[topM];
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
class MinStack {
Stack<Integer> A , B;
/** initialize your data structure here. */
public MinStack() {
A = new Stack();
B = new Stack();
}
public void push(int x) {
A.push(x);
if(B.empty() || x <= B.peek()){
B.push(x);
}
}
public void pop() {
if(!A.empty()){
if(A.peek().intValue() == B.peek().intValue()){
B.pop();
}
A.pop();
}
}
public int top(){
return A.peek();
}
public int min() {
return B.peek();
}
}
class MinStack {
Deque<Integer> minStack;
Deque<Integer> xStack;
/** initialize your data structure here. */
public MinStack() {
minStack = new ArrayDeque<>();
xStack = new ArrayDeque<>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
xStack.push(x);
minStack.push(Math.min(x,minStack.peek()));
}
public void pop() {
xStack.pop();
minStack.pop();
}
public int top() {
return xStack.peek();
}
public int min() {
return minStack.peek();
}
}
//全部数据进入stack1
Stack<Integer> stack1;
//仅存储比stack2原来数小的元素
Stack<Integer> stack2;
/**
* initialize your data structure here.
*/
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.push(x);
if (stack2.isEmpty() || x <= stack2.peek()) {
stack2.push(x);
}
}
public void pop() {
Integer pop = stack1.pop();
if (!stack2.isEmpty() && pop.equals(stack2.peek())) {
stack2.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
class MinStack {
Stack<Integer> stack1;
Stack<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
this.stack1 = new Stack<>();
this.stack2 = new Stack<>();
}
public void push(int x) {
stack1.push(x);
if(stack2.isEmpty() || x <= stack2.peek().intValue()){
stack2.push(x);
}
}
public void pop() {
if (!stack1.isEmpty()){
if(stack1.peek().intValue() == stack2.peek().intValue()){
stack2.pop();
}
stack1.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
class MinStack {
private Stack<Integer> data;
private Stack<Integer> ser;
/** initialize your data structure here. */
public MinStack() {
data = new Stack<Integer>();
ser = new Stack<Integer>();
}
public void push(int x) {
data.push(x);
if(ser.isEmpty()) {
ser.push(x);
return;
}
ser.push(x > ser.peek() ? ser.peek() : x);
}
public void pop() {
data.pop();
ser.pop();
}
public int top() {
return data.peek();
}
public int min() {
return ser.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
class MinStack {
Stack<Integer> A, B;
public MinStack() {
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
A.add(x);
if(B.empty() || B.peek() >= x)
B.add(x);
}
public void pop() {
if(A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
时间O(1)空间O(N)
class MinStack {
Stack<Integer> stack;
// 辅助栈 每次发生push的时候,栈顶都存一个最小值。
Stack<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
stack.push(x);
minStack.push(Math.min(minStack.peek(),x));
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
class MinStack {
private Stack stack;
private Stack min;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
min = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (min.isEmpty()) {
min.push(x);
} else {
int minValue = min.peek() > x ? x : min.peek();
min.push(minValue);
}
}
public void pop() {
stack.pop();
min.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return min.peek();
}
}
class MinStack {
/** initialize your data structure here. */
public MinStack() {
A = new Stack<>();
B = new Stack<>():
}
public void push(int x) {
A.add(x);
if(B.isEmpty() || B.peek() >= x){
B.add(x);
}
}
public void pop() {
if (A.pop().equals(B.peek())){
B.pop():
}
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
class MinStack {
Stack<Integer> A, B;
/** initialize your data structure here. */
public MinStack() {
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
A.add(x);
if(B.empty() || B.peek() >= x)
B.add(x);
}
public void pop() {
if(A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
class MinStack {
Deque<Integer> stack;
Deque<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new ArrayDeque<>();
minStack = new ArrayDeque<>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
stack.push(x);
minStack.push(Math.min(minStack.peek(), x));
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
class MinStack {
/** initialize your data structure here. */
Stack<Integer> a,b;
public MinStack() {
a = new Stack<>();
b = new Stack<>();
}
public void push(int x) {
a.push(x);
if(b.isEmpty() || x <= b.peek()){
b.push(x);
}
}
public void pop() {
//这里比较关键,如果a弹出,则需要对b中相同值弹出,保证一致性
if(a.pop().equals(b.peek())){
b.pop();
}
}
public int top() {
return a.peek();
}
public int min() {
return b.peek();
}
}
//空间换时间
class MinStack {
private LinkedList<Integer> stack1;
private LinkedList<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void push(int x) {
stack1.offerLast(x);
if(stack2.isEmpty() || stack2.peek().intValue() >= x){
stack2.offerLast(x);//stack2始终保存最小值
}
}
public void pop() {
if(!stack1.isEmpty()){
//Integer, 数值 > 127 I
if(stack1.getLast().intValue() == stack2.getLast().intValue()){
//当前弹出元素为最小元素
stack2.removeLast();
}
stack1.removeLast();
}
}
public int top() {
return stack1.getLast();
}
public int min() {
return stack2.getLast();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
//空间换时间
//时间复杂度O(1)
//空间复杂度O(n) 辅助栈
class MinStack {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.push(x);
if(stack2.isEmpty() || stack2.peek().intValue() >= x){
stack2.push(x);//stack2始终保存最小值
}
}
public void pop() {
if(!stack1.isEmpty()){
//Integer, 数值 > 127 I
if(stack1.peek().intValue() == stack2.peek().intValue()){
//当前弹出元素为最小元素
stack2.pop();
}
stack1.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
手写链表
/**
手写链表实现
*/
//时间复杂度O(1)
//空间复杂度O(n)
class MinStack {
private Node node;
private class Node{
int val;
int min;
Node next;
public Node(int val,int min,Node next){
this.val = val;
this.min = min;
this.next = next;
}
}
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
if(node == null){
node = new Node(x,x,null);
}else{
node = new Node(x,Math.min(x,node.min),node);
}
}
public void pop() {
node = node.next;
}
public int top() {
return node.val;
}
public int min() {
return node.min;
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
class MinStack {
Stack<Integer> a,b;
/** initialize your data structure here. */
public MinStack() {
a= new Stack<Integer>();
b= new Stack<Integer>();
}
public void push(int x) {
a.add(x);
if(b.empty()|| b.peek()>=x){
b.add(x);
}
}
public void pop() {
if(a.pop().equals(b.peek())) b.pop();
}
public int top() {
return a.peek();
}
public int min() {
return b.peek();
}
}
第二种:
class MinStack {
Deque<Integer> xStack;
Deque<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
xStack = new LinkedList<Integer>();
minStack = new LinkedList<Integer>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
xStack.push(x);
minStack.push(Math.min(minStack.peek(),x));
}
public void pop() {
xStack.pop();
minStack.pop();
}
public int top() {
return xStack.peek();
}
public int min() {
return minStack.peek();
}
}
class MinStack {
/** initialize your data structure here. */
Stack<Integer> stk;
Stack<Integer> minStk;
public MinStack() {
// 多用一个最小栈,保存当前栈中最小的元素
stk = new Stack<>();
minStk = new Stack<>();
}
public void push(int x) {
stk.push(x);
int curMin = minStk.isEmpty() ? x:minStk.peek();
minStk.push(Math.min(curMin,x));
}
public void pop() {
stk.pop();
minStk.pop();
}
public int top() {
return stk.peek();
}
public int min() {
return minStk.peek();
}
}
class MinStack {
//用集合来实现栈,调用集合的方法
//时间复杂度O(1)
//空间复杂度O(n)
/** initialize your data structure here. */
List<Integer> stack;
public MinStack() {
stack = new ArrayList<>();
}
public int min(){
Integer m = Collections.min(stack);
String s = m.toString();
int a = Integer.parseInt(s);
return a;
}
public void push(int value){
stack.add(value);
}
public int pop(){
int a = stack.remove(stack.size()-1);
return a;
}
public int top(){
int a = stack.get(stack.size()-1);
return a;
}
}
class MinStack {
Stack<Integer> A;
Stack<Integer> B;
public MinStack() {
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
A.add(x);
if(B.empty() || B.peek() >= x)
B.add(x);
}
public void pop() {
if(A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
class MinStack {
Stack<Integer> stack1;
Stack<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
this.stack1 = new Stack();
this.stack2 = new Stack();
}
public void push(int x) {
stack1.push(x);
if (stack2.isEmpty() || x <= stack2.peek().intValue()) {
stack2.push(x);
}
}
public void pop() {
if (!stack1.isEmpty()) {
if (stack1.pop().intValue() == stack2.peek().intValue()) {
stack2.pop();
}
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
class MinStack {
/** initialize your data structure here. */
Stack<Integer> stack,minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if(minStack.empty() || x < minStack.peek()){
minStack.push(x);
}else {
minStack.push(minStack.peek());
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
共以下 63 个回答
使用两个栈来实现
辅助栈同步维护每一个元素还没被取出的时候,最大值是多少,当元素被取出时,辅助栈也要同步取出
时间复杂度:O(1)
空间复杂度:O(n)
很基础
利用两个数组实现栈和min
思路:
利用两个栈解决此问题
入栈时normalStack正常入栈,而minStack入栈的元素需要和原先元素进行比较,如果小于当前的栈内元素则将其入栈
用另一个栈把当前栈内的最小元素存储在栈顶
辅助栈
只需要再准备一个栈存储最小的元素,保持两个栈中的元素同步就行
先用了两个容器,发现时间和空间效果很差。于是看题解。直接存一个pair,每一个push进去的pair都存放了当前的值和截止到目前的最小值。其他正常操作。需要注意的点是pop的时候弹走的是否为最小值的元素
时间O(1)
空间O(n)
辅助栈存放每次入栈时的栈中和当前值间的最小值
使用辅助栈
时间 O(1)
空间 O(N)
使用两个辅助栈
时间 O(1)
空间 O(N)
感觉直接抛出异常也没有问题,本来就是栈,操作不当就是有可能栈空。
//两个栈 st1,st2;
包含min函数的栈
class MinStack {
public:
stack
/** initialize your data structure here. */
MinStack() {
};
别想太多
肯定需要一个辅助栈来完成任务,一开始想的是辅助栈来进行把已有的数据进行排序,但是这样做代码量太大
直接放弃,只存储最小的,注意两个栈的一致性即可!
时间复杂度O1
空间复杂度On
用辅助栈,每次往minStack推入元素时比较新元素与栈顶元素的大小
1、首先定义两个栈,一个作为主栈,一个作为辅助栈,主栈用来存储数据,辅助栈用来存储最小值
2、在入栈操作中,A栈肯定是要入元素的,对于B栈来说,判断一下如果B栈为空或者B的top元素大于要入栈的元素,则元素也入B栈
3、执行出栈操作时,先判断A的栈顶元素和B的栈顶元素是不是同一个,如果是则同时出栈,如果不是则A执行出栈
4、top方法,直接执行A的top就可以
5、min方法,直接执行B的min就可以
思路:需要用到一个辅助栈min,栈min的栈顶为当前栈中的最小值。怎么维护栈min,当入栈第一个元素x时,直接将x也入栈到栈min中,当入栈第二个元素e时,与栈min的栈顶元素,即当前栈中的最小值minVlue,作比较,如果e<minValue,说明栈中的最小值需要更新,直接将e入栈到栈min,这样栈min的栈顶就是元素e。如果e>=minValue,说明栈中的最小值不需要更新,直接将栈min的栈顶元素再入栈一次就行。时间复杂度O(1),空间复杂度O(N)。
思路:
和昨天用栈实现队列的思想很相似,用一个栈(栈1)存储入栈元素,另一个栈作为辅助栈(栈2)。
辅助栈的作用是每次要执行入栈操作时:
+ 如果该元素的值小于或等于辅助栈中的栈顶元素,或者辅助栈中没有元素,那么栈1和栈2同时执行入栈操作。
+ 如果该元素的值大于辅助栈中的栈顶元素,那么只有栈1进行入栈操作。
+ 这样我们就可以保证在辅助栈的栈顶元素是栈中的最小元素。
在执行出栈操作时:
+ 如果栈1的执行出栈操作后返回的值与栈2的栈顶元素的值相同,那么栈2也要执行出栈操作。
+ 否则只有栈1执行出栈操作。
使用一个辅助栈来存放对应位置栈的最小值,注意在出栈的时候辅助的最小栈也要执行出栈操作
剑指 Offer 30. 包含min函数的栈
解法思路
使用一个辅助栈b,主栈a正常压入弹出操作,辅助栈b保持为一个非升序列(即栈上方元素小于等于下方元素)。
时间复杂度 O(1)
所有相关函数都不涉及遍历操作。
空间复杂度 O(n)
最差情况是本身压入顺序就是一个非升序列。
leetcode beats
时间:70%
空间:50%
代码
利用一个辅助栈,每次入栈的时候,若辅助栈为空则入栈,若辅助栈不为空,则判断入栈的元素是否小于辅助栈顶的元素,若小于则入栈,否则不入栈。
出栈时判断出栈元素与辅助栈的栈顶是否相等,若相等时,则辅助栈也一起出栈。否则辅助栈不出栈。栈顶元素即为栈中的最小值。
解题思路:
普通栈的 push() 和 pop() 函数的复杂度为 O(1)O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N)O(N) 。
本题难点: 将 min() 函数复杂度降为 O(1)O(1) ,可通过建立辅助栈实现;
数据栈 AA : 栈 AA 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
辅助栈 BB : 栈 BB 中存储栈 AA 中所有 非严格降序 的元素,则栈 AA 中的最小元素始终对应栈 BB 的栈顶元素,即 min() 函数只需返回栈 BB 的栈顶元素即可。
因此,只需设法维护好 栈 BB 的元素,使其保持非严格降序,即可实现 min() 函数的 O(1)O(1) 复杂度。
辅助栈的思路
时间O(1)
空间O(n)
空间复杂度取决于入栈数字的大小关系,因为每次是将小于等于当前最小值的数入栈到辅助栈
思路:用到2个辅助栈,一个存放数据,另一个动态的实时存放最小值。
时间复杂度:O(1)
基本思路:使用两个栈。其中一个栈作为辅助栈,主要找入栈元素中最小的值,在入栈的时候进行对辅助栈进行判断,并且下一个入栈元素是否<=辅助栈中栈顶的元素。出栈时,需要判断辅助栈中top元素值是是否与另一个栈的值相等。
时间复杂度:O(1)
空间复杂度:O(n)
啊
用linkedlist用例有问题???
手写链表
时间复杂度:O(1)
空间复杂度:O(n)
第二种:
push 同时记录当前最小值
用两个栈进行操作,A栈存正常数据,保证正常的出栈入栈操作,B栈严格存放从大到小的数据,这样min操作就是查看B栈的栈顶元素。注意出栈要判断A栈出栈的元素是否是B栈栈顶元素,避免A、B栈元素不一致。
解题思路:创建主栈和辅助栈,主栈执行正常的push、pop等操作,辅助栈在每次push时,和栈顶最小元素对比,只有小于等于最小元素才入栈,出栈时也是类似操作;
时间复杂度:O(1)
空间复杂度:O(n)
一个栈记录,另一个栈进行排序,把最小的放在栈顶
辅助栈
1. 时间复杂度:O(1)
2. 空间复杂度:O(n)
3. 代码
第五天第一题
栈1正常入栈出栈,栈2的栈顶元素是栈1所有元素的最小值
Integer:-128 — 127 缓存
这里注意Integer如果超过上面那个范围,就会出现值相等,但比较不相等的情况,需要使用intValue()转化为int类型
最重要的算法思路:我认为是就是那个1.(最重要)最小栈的栈顶永远都是最小的值
2.往里面push的时候push进来的值和栈顶的值比较一下
额外创建栈,保存最小元素,保证该栈栈顶为最小元素即可
stack.peek()返回的是对象!!!这里把我坑惨了
思路
需要两个栈来操作。栈1存正常数据,栈2传min值
每次进栈时,栈1正常,栈2判断与栈顶元素大小关系
每次出栈时,栈1正常,栈2判断与栈顶元素是否相等
保证栈2顶永远是栈1中的最小值
代码