• 最小栈元素寻找(如何最优化)


    一、时间复杂度为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;
    }

  • 相关阅读:
    IDEA中将Spring Boot打包成jar运行
    Github 最简单的认证方式 Access Token
    如何恢复IIS出厂默认设置
    How to fix TFS workspace mapping error in Jenkins
    SetForegroundWindow Win32API not always works on Windows7
    SonarQube 简介
    关于软件稳定性测试的思路
    ShareSVN授权的代码示例
    使用C#加密及解密字符串
    如何通过代码设置WPF控件的字体,颜色
  • 原文地址:https://www.cnblogs.com/victorywr/p/13339058.html
Copyright © 2020-2023  润新知