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

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

 

posted @ 2020-07-19 11:21  victorywr  阅读(266)  评论(0编辑  收藏  举报