描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,并且调用 min函数、push函数 及 pop函数 的时间复杂度都是 O(1)
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素
push、pop、top都是栈的基本操作。
这题目需要考虑的是怎么获取栈中的最小元素呢?
讨论组的题解均是创建两个栈,一个栈用于push、pop、top,另外一个栈来存最小元素。
每次push元素的时候,都会跟栈2顶上的那个元素比较,一开始栈2为空,所以直接push第一个元素,当第二个元素push的时候,跟第一个元素比较,如果小于第一个元素就输入到栈2中。这时候要注意的是pop操作,如果栈1pop顶部元素,这个顶部元素刚好也是栈2的顶部元素,这个时候两个栈都要进行一次pop操作。
先看一下python代码:
①首先创建两个空栈
②push操作,min = self.min()右边的min()是调用的类内函数用来返回辅助栈的栈顶,就是返回最小值,然后通过比较push的元素和目前最小值的元素大小,如果push的元素比目前最小值小,就加入到栈2中,否则还是以目前最小值为最小值。
③ 讨论组Yannyezixin给出的思路
栈1:3,4,2,5,1
栈2:3,3,2,2,1
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack = []
self.assist = []
def push(self, node):
min = self.min()
if not self.assist or node < min:
self.assist.append(node)
else:
self.assist.append(min)
self.stack.append(node)
def pop(self):
if self.stack:
self.assist.pop()
return self.stack.pop()
def top(self):
# write code here
if self.stack:
return self.stack[-1]
def min(self):
# write code here
if self.assist:
return self.assist[-1]
因为栈的操作算数据结构的基础部分了,所以这道题还是看一下C/C++的代码。
class Solution {
public:
stack<int> stack1,stack2;
void push(int value) {
stack1.push(value);
if(stack2.empty())
stack2.push(value);
else if(value<=stack2.top())
{
stack2.push(value);
}
}
void pop() {
if(stack1.empty()) return;
if(stack1.top()==stack2.top())
stack2.pop();
stack1.pop();
}
int top() {
return stack1.top();
}
int min() {
return stack2.top();
}
};