zoukankan      html  css  js  c++  java
  • O(1)复杂度求一个栈的最小值

    要求一个栈的最小值,第一反应肯定是一个个出栈,那样太蠢了,如何更优呢?

    第一个思路就是自己定义一个指针,始终指向保存了最小值的那个节点不就行了。看似正确,但是当你最小值的那个节点出栈了,那么如何找到下一个最小值呢?

    因此,我们需要一个数据结构来保存每一个状态下的最小值。即我们应当知道每当栈中插入一个新元素后的最小值位置,也应当知道每当栈中删除一个元素后的最小值的位置。

    做法很简单,用另一个栈来记录每一个状态下的最小值的位置即可!
    我们假设原来的那个栈叫stack,用来记录最小值位置的栈叫minStack,那么我们要做的就是让minStack随着stack的变化而动态变化,stack出栈时,minStack跟着出栈,stack入栈时,minStack跟着入栈。
    minStack入栈的是什么呢?很显然,是拿stack新入栈的元素和minStack栈顶元素比较大小,如果minStack栈顶元素比stack新入栈元素小,那么minStack就入栈一个和原来minStack栈顶元素相同的的元素,否则入栈新入栈的这个元素的指针。
    新入栈的元素如果和原来minStack栈顶元素一样大,那么入不入栈都行,因为后入栈的必定先出栈,不论如何都可以保证一直都能找到最小值。

    说了这么多,想练练手的可以去:https://leetcode-cn.com/problems/min-stack/

    下面放上我的代码:

    class MinStack {
    public:
        /** initialize your data structure here. */
        
        stack<int> sstack;
        stack<int> minStack;
        
        MinStack() {
            
        }
        
        void push(int x) {
            sstack.push(x);
            if(minStack.size() == 0)
            {
                minStack.push(x);
                return;
            }
            int originTop = minStack.top();
            if(x <= originTop)
            {
                minStack.push(x);
            }else{
                minStack.push(originTop);
            }
        }
        
        void pop() {
            sstack.pop();
            minStack.pop();
        }
        
        int top() {
            return sstack.top();
        }
        
        int getMin() {
            return minStack.top();
        }
    };
    
    /**
     * 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();
     */
    
  • 相关阅读:
    iOS 内存分配与分区
    iOS 静态库和动态库
    iOS 静态:动态 Pod
    iOS 架构
    基本控件文档-UIScrollView
    UIActivityIndicatorView
    UIControl事件
    UIDatePicker
    UIPageControl
    UIScrollView
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287444.html
Copyright © 2011-2022 走看看