zoukankan      html  css  js  c++  java
  • min stack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

    • push(x) -- Push element x onto stack.
    • pop() -- Removes the element on top of the stack.
    • top() -- Get the top element.
    • getMin() -- Retrieve the minimum element in the stack.

    构建一个最小栈。除了可以实现栈的出栈入栈、返回栈顶元素之外,还可以实现返回最小值。。实现栈的基本功能很简单,只需内部使用一个stack就行,但是要返回最小值就有点小复杂,因为每次出栈可能会影响最小值。。这里使用链表,每个节点中含有最小值信息,每添加一个节点,就将此节点的min设置为当前所有元素的最小值。因为是往表头添加元素,每次添加只需跟表头的节点的min进行比较,将两者最小的放进自己的节点中。

    class MinStack {
        Node head;
        
        /** initialize your data structure here. */
        public MinStack() {
           
        }
        
        public void push(int x) {
            if(head==null){
                head=new Node(x,x);
            }else{
          //这里是关键,一开始添加节点会将最小值信息放到第一个节点中,然后每次添加一个,会跟前面的节点的最小值比较,将较小的值放进自己节点,
          //这样可以保证表头的节点中存放的是链表中的最小值信息。就算删除表头,下一个节点成为新表头,该节点中存放的剩下节点中的最小值。 head
    =new Node(x,Math.min(x,head.min),head); } } public void pop() { head=head.next; } public int top() { return head.val; } public int getMin() { return head.min; } private class Node{ private int val; private int min; private Node next; public Node(int val,int min){ this(val,min,null); } public Node(int val,int min,Node next){ this.val=val; this.min=min; this.next=next; } } } /** * 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.getMin(); */

     根据上面的思路,也是可以使用栈和数组集合作为辅助,数组集合存放当前及以前元素的最小值。如下面代码,就是使用了一个数组集合,存放每个元素及之前所有元素的最小值。

    当pop()时,最小值发生变化,此时只需list中删除最后一个就行。

    class MinStack {
        Stack<Integer> stack;
       //使用一个数组集合,存放当前元素和之前元素的最小值。这个在每输入一个元素就可以判断了,当删除一个元素时,集合删除最后一个最小值 
       List<Integer> minList;
        public MinStack() {
           stack=new Stack<>();
            minList=new ArrayList<>();
        }
        
        public void push(int x) {
           if(stack.isEmpty()) {
               stack.push(x);
               minList.add(x);
           }else{
               stack.push(x);
               minList.add(Math.min(x,minList.get(minList.size()-1)));
           }
        }
        
        public void pop() {
          if(stack.isEmpty()) return ;
            
            stack.pop();
            minList.remove(minList.size()-1);
        
        }
        
        public int top() {
         return stack.peek();
        }
        
        public int getMin() {
          return minList.get(minList.size()-1);
        }
    
      
    }
  • 相关阅读:
    内置函数
    json && pickle 反序列化
    装饰器(语法糖)
    shell环境改变引起的命令提示符改变
    FTP服务安装与端口说明
    tomcat配置
    greenDao 中连接查询
    COM组件DLL引用时出现检索组件错误
    VS 调试断点命中了,程序无法再断点处中断
    单点登录原理与简单实现
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8084933.html
Copyright © 2011-2022 走看看