題意:定義棧的數(shù)據(jù)結(jié)構(gòu),請在該類型中實現(xiàn)一個能夠得到棧最小元素的min函數(shù)腊凶。
算法思想:定義兩個棧,一個用來保存原數(shù)拴念,一個用來求得棧的最小值钧萍。原棧每push一個元素,都與最小棧中的棧頂元素比較政鼠,如果比棧頂元素小风瘦,則最小棧push新元素,否則最小棧再次push最小棧棧頂元素公般。
實現(xiàn)代碼一:時間復(fù)雜度O(1),空間復(fù)雜度O(n)
class Solution {
stack<int> srcStack;
stack<int> minStack;
public:
void push(int value) {
srcStack.push(value);
if(minStack.empty())
minStack.push(value);
else
{
int top = minStack.top();
if(top < value)
minStack.push(top);
else
minStack.push(value);
}
}
void pop() {
srcStack.pop();
minStack.pop();
}
int top() {
return srcStack.top();
}
int min() {
return minStack.top();
}
};
實現(xiàn)代碼二:時間復(fù)雜度O(1),空間復(fù)雜度O(1)
class Solution {
stack<int> srcStack;
int minResult;
public:
void push(int value) {
if(srcStack.empty()){
srcStack.push(value);
minResult = value;
}
else{
if(value > minResult)
srcStack.push(value-minResult);
else{
srcStack.push(value-minResult);
minResult = value;
}
}
}
void pop() {
int top = srcStack.top();
srcStack.pop();
if(top < 0){
minResult -= top;
}
}
int top() {
int top = srcStack.top();
if(top < 0)
return minResult;
else
return minResult+top;
}
int min() {
return minResult;
}
};