设计一个带有getmin功能的栈,保证时间复杂度在O(1)
2017-06-22 20:56:10
需要得到最小值,最简单的思路就是遍历一遍求出最小值。但是这样的时间复杂度会是O(n),不满足O(1)的要求。于是想到在建立一个栈来保存最小值。
具体操作是建立两个栈,一个存放数据,一个存放最小值。
push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入。这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入;
pop:将数据栈的元素弹出时需要比较他和最小值栈的栈顶元素大小,若等于的话,也需要将最小值栈的栈顶元素pop出来;
getmin:只需要将最小值栈的栈顶元素返回即可。
1 class Mystack 2 { 3 stack<int> s1; 4 stack<int> mins; 5 6 public: 7 void pop() 8 { 9 if(s1.empty()) {cout<<"栈空\n"; return;} 10 else 11 { 12 int temp = s1.top(); 13 if(temp == mins.top()){mins.pop();} 14 s1.pop(); 15 } 16 } 17 18 void push(int key) 19 { 20 if(mins.empty()) {mins.push(key);cout<<"mins "<<key<<endl;s1.push(key);} 21 else 22 { 23 if(mins.top() >= key) {mins.push(key);cout<<"mins "<<key<<endl;} 24 s1.push(key); 25 } 26 } 27 28 void getmin() 29 { 30 if(mins.empty()) {cout<<"当前栈为空\n";} 31 else cout<<mins.top()<<endl; 32 } 33 }
还有一种只采用一个栈就能解决的方法,具体步骤是遇到小于等于当前最小值的数,也就是会改变最小值的数,将当前最小值压栈,并修改最小值,然后将当前数压栈,否则直接压栈。
在pop的时候需要对当前的pop出的数值进行判断,如果等于最小值,那么意味着,最小值将会被,改变所以需要pop两次。
public class MinStack { Stack<Integer> s; int min; /** initialize your data structure here. */ public MinStack() { s = new Stack<>(); min = Integer.MAX_VALUE; } public void push(int x) { if(x <= min) { s.add(min); min = x; } s.add(x); } public void pop() { if(s.pop() == min) min = s.pop(); } public int top() { return s.peek(); } public int getMin() { return min; } }