剑指Offer_编程题_包含min函数的栈

2020-04-27 16:04:40来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

剑指Offer_编程题_包含min函数的栈

剑指Offer_编程题_包含min函数的栈

剑指Offer_编程题_包含min函数的栈

考点: 举例让抽象具体化

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。   链接:https://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49?f=discussion
来源:牛客网

思路

    看到这个问题, 我们最开始可能会想, 添加一个成员变量用于保存最小元素, 每次压栈时如果压栈元素比当前最小元素更小, 就更新最小元素.      但是这样会有一个问题, 如果最小元素被弹出了呢, 如何获得下一个最小元素呢? 分析到这里可以发现, 仅仅添加一个成员变量存放最小元素是不够的, 我们需要在最小元素弹出后还能得到次小元素, 次小的弹出后, 还要能得到次次小的.      因此, 用另一个栈来保存这些元素是再合适不过的了. 我们叫它最小元素栈.      每次压栈操作时, 如果压栈元素比当前最小元素更小, 就把这个元素压入最小元素栈, 原本的最小元素就成了次小元素. 同理, 弹栈时, 如果弹出的元素和最小元素栈的栈顶元素相等, 就把最小元素的栈顶弹出.  
import java.util.Stack;

public class Solution {
    Stack<Integer> s = new Stack<Integer>();
    Stack<Integer> sMin = new Stack<Integer>();
    
    void push(int value) {
        s.push(value);
        if(sMin.empty())
            sMin.push(value);
        else if(value <= sMin.peek())
            sMin.push(value);
    }
    void pop() {
        if(s.peek().equals(sMin.peek()))
            sMin.pop();
        s.pop();
    }
    int top() {
        return s.pop();
    }
    int min() {
        return sMin.peek();
    }
}

 


原文链接:https://www.cnblogs.com/liran123/p/12785127.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:面试官:你的缺点是什么?这样回答漂亮!

下一篇:如何在金三银四快人一步?来看看这份一线IT名企Java必备面试文档