題意:定義棧的數(shù)據(jù)結(jié)構(gòu),請(qǐng)?jiān)谠擃愋椭袑?shí)現(xiàn)一個(gè)能夠得到棧最小元素的min函數(shù)。
算法思想:定義兩個(gè)棧,一個(gè)用來保存原數(shù),一個(gè)用來求得棧的最小值。原棧每push一個(gè)元素,都與最小棧中的棧頂元素比較,如果比棧頂元素小,則最小棧push新元素,否則最小棧再次push最小棧棧頂元素。
實(shí)現(xiàn)代碼一:時(shí)間復(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();
}
};
實(shí)現(xiàn)代碼二:時(shí)間復(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;
}
};