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