zoukankan      html  css  js  c++  java
  • 最小栈元素寻找(如何最优化)

    一、时间复杂度为N,空间复杂度为1(遍历整个栈元素,逐个比较,找出最小值)

    二、空间复杂度为N,时间复杂度为1(创建一个辅助栈,栈顶存放当前已入栈的最小值)

    例如我们要把数组 arr = {2, 1, 3} 都放⼊栈中,则存放过程如下:

    1、⾸先 push 2。由于刚开始 stack 和 helper 都是空的,所以直接把 2 放⼊,此时⽬标栈和辅助栈的 值如下:stack = {2},helper = {2}。

    2、接下来 push 1。由于 helper 栈顶元素⽐ 1 ⼤,所以直接把 1 放⼊ helper 的栈顶,此时:stack = {2, 1},helper = {2, 1}。

    3、接下来 push 3,由于 helper 栈顶元素⽐ 3 ⼩,所以重复把 栈顶的元素再次⼊栈,此时: stack = {2, 1, 3},helper = {2, 1, 1}。

    三、时间复杂度为1,空间复杂度也为1(空间复杂度为1,那么就不能有辅助栈的出现,可是也要想办法让栈顶为最小值才能保证时间复杂度也为1)

    采用栈顶存放差值,通过差值为0,负,正来确定当前的最小值。

    法一略,比较易懂实现

    法二:

    #include<iostream>
    #include<stack>
    using namespace std;
    
    int main()
    {
        stack<int> stk1,stk2;
        int m;
        cout << "input an array:" << endl;
        while (cin >> m)
        {
                if (m == 'q')       //以字符q作为数字输入的结尾符
                break;
                cout << m<<" ";
                stk1.push(m);
                if (stk2.empty())
                {
                    stk2.push(m);
                }
                else if (stk2.top() > m)   //栈顶元素若大于m;
                {
                    stk2.push(m);
                }
                else                    //栈顶元素若小于m;
                    stk2.push(stk2.top());
        }
        
        cout << "最小元素:" << endl;
        cout << stk2.top() << endl;
    }

     法三:

    #include<iostream>
    #include<stack>
    using namespace std;
    
    int main()
    {
    stack<int> stack1;
        int m;
        int min;
        cout << "input an array:" << endl;
        while (cin >> m)
        {
            if (m == 'q')
                break;
            if (stack1.empty())
            {
                min = m;
                stack1.push(0);
            }
            
            else 
            {
                stack1.push((m - min));//存放差值
                min = stack1.top() >= 0 ? min : m;
            }
    
        }
        cout << "最小值:" << endl;
        cout << min << endl;
    }

  • 相关阅读:
    HTTP学习三:HTTPS
    JavaScript判断变量的类型
    用JS创建10个<a>标签,点击的时候弹出来对应的序号
    【工具】根据后端提供的swagger生成前端的axios请求配置文件/api
    JavaScript正则表达式-零宽断言
    JavaScript中数组去重、对象去重的方法
    收集的无版权图片网站(欢迎补充)
    css 清除浮动
    JavaScript+CSS+HTML 编写手风琴效果
    Mac定制终端:iTerm2 + zsh + powerline
  • 原文地址:https://www.cnblogs.com/victorywr/p/13339058.html
Copyright © 2011-2022 走看看