美文网首页
《剑指offer》(二十)-包含min函数的栈(java)

《剑指offer》(二十)-包含min函数的栈(java)

作者: 鼠小倩 | 来源:发表于2019-12-30 12:05 被阅读0次

    包含min函数的栈

    考点:栈

    题目描述

    定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    代码格式
    import java.util.Stack;
    
    public class Solution {    
        public void push(int node) {        
        } 
        public void pop() {        
        } 
        public int top() {        
        }    
        public int min() {    
        }
    }
    
    测试用例
    image.png
    知识点

    java中的栈Stack的基本使用和应用
    栈定义  栈是一种只能在一端进行插入或删除操作的线性表。(先进后出表)
    java中的Stack继承Vector
    实例化 Stack stack=new Stack();
    基本使用:
    判断是否为空stack.empty()
    取栈顶值(不出栈)stack.peek()
    进栈stack.push(Object);
    出栈stack.pop();

    解题一-两个栈

    1.思路
    栈stack1保存数据,辅助栈stack2保存依次入栈最小的数
    stack1中依次入栈,6,5,8,4,3,9
    stack2依次入栈,6,5,5,4,3,3
    每次入栈的时候,如果入栈的元素比stack2中的栈顶元素小或等于则入栈,否则不入栈。
    2.代码

    import java.util.Stack;
    
    public class Solution {
        private Stack<Integer> stack1=new Stack<>();
        private Stack<Integer> stack2=new Stack<>();
        
        public void push(int node) {
            stack1.push(node);
            if(stack2.empty()){
                stack2.push(node);
            }else{
                if(node <= stack2.peek()){
                    stack2.push(node);
                }else{
                    stack2.push(stack2.peek());
                }
            }
        }
        
        public void pop() {
            stack1.pop();
            stack2.pop();
        }
     
        public int top() {
            return stack1.peek();
        }
     
        public int min() {
            return stack2.peek();
        }
    }
    

    解题二-一个栈

    1.思路
    在栈中需要保留冗余的曾经的最小值,这样能够比较方便到找到当前的此小值
    2.代码

    //https://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49?answerType=1&f=discussion
    //牛客网
    
    import java.util.Stack;
     
    public class Solution {
     
        //需要这样写来初始化stack,不然会报空指针push的时候
        private static Stack<Integer> stack = new Stack<Integer>();
        private static Integer minElement = Integer.MAX_VALUE;
     
        public void push(int node) {
            if(stack.empty()){
                minElement = node;
                stack.push(node);
            }else{
                if(node <= minElement){
                    stack.push(minElement);//在push更小的值时需要保留在此值之前的最小值
                    minElement = node;
                }
                stack.push(node);
            }
        }
     
        public void pop() {
     
           //增加最后一个元素以及栈为空时候的检测
            if(stack.size() == 0)return;
            if( minElement == stack.peek()){
                if(stack.size() >1){
                    stack.pop();
                    minElement = stack.peek();
                }else{
                    minElement = Integer.MAX_VALUE;
                }
     
            }
            stack.pop();
        }
     
        public int top() {
            return stack.peek();
        }
     
        public int min() {
            return minElement;
        }
    }
    

    相关文章

      网友评论

          本文标题:《剑指offer》(二十)-包含min函数的栈(java)

          本文链接:https://www.haomeiwen.com/subject/tkhyoctx.html