zoukankan      html  css  js  c++  java
  • 剑指 Offer 30. 包含min函数的栈

    剑指 Offer 30. 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

    示例:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.min(); --> 返回 -3.
    minStack.pop();
    minStack.top(); --> 返回 0.
    minStack.min(); --> 返回 -2.

     

    解题思路:
    普通栈的 push() 和 pop() 函数的复杂度为 O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N) 。

    本题难点: 将 min() 函数复杂度降为 O(1),可通过建立辅助栈实现;
    数据栈 A : 栈 A 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
    辅助栈 B : 栈 B 中存储栈 A 中所有 非严格降序 的元素,则栈 A 中的最小元素始终对应栈 B 的栈顶元素,即 min() 函数只需返回栈 B 的栈顶元素即可。
    因此,只需设法维护好 栈 B 的元素,使其保持非严格降序,即可实现 min() 函数的 O(1) 复杂度。

    A (即 A.add(x) );
    若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x 压入栈 B (即 B.add(x) )。
    pop() 函数: 重点为保持栈 A, B的 元素一致性 。

    执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;
    若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。
    top() 函数: 直接返回栈 A 的栈顶元素即可,即返回 A.peek() 。

    min() 函数: 直接返回栈 B 的栈顶元素即可,即返回 B.peek() 。

    代码:

    #include<iostream>
    #include<stack>
    using namespace std;
    
    class MinStack {
    public:
        stack<int>A,B;
        MinStack() {
    
        }
        
        void push(int x) {
            A.push(X);
            if(x<=B.top()||B.empty())B.push(x);
    
        }
        
        void pop() {
            if(A.top()==B.top()){
                A.pop();
                B.pop();
            }
        }
        
        int top() {
            return A.top();
        }
        
        int min() {
            return B.top();
        }
    };
    int main(){
        MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        minStack.min();   --> 返回 -3.
        minStack.pop();
        minStack.top();      --> 返回 0.
        minStack.min();   --> 返回 -2.
    
    }

    复杂度分析:
    时间复杂度 O(1) : push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
    空间复杂度 O(N): 当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N 个元素,使用 O(N) 额外空间。

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13511217.html

  • 相关阅读:
    35个Java代码优化的细节,你知道几个?
    Java如何优雅地实现接口数据校验
    Java中方法的重载详解(含系统配套视频)
    七大经典、常用排序算法的原理、Java 实现以及算法分析
    Java静态方法和实例方法
    Java静态变量和实例变量
    “反转链表”相关的题目
    【C++】将十进制数转换为十六进制数
    第四章:动态规划I
    【C++】数组中的第k个最小元素
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13511217.html
Copyright © 2011-2022 走看看