题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
方法一 解法不满足题目要求,不过获取正确数据
import java.util.Stack;
/**
* 我这个时间复杂度有问题,有个o(n)在里头,就是
* 那个findMin是个o(n)的复杂度
*
*/
public class Solution {
private Stack<Integer> stack;
private int min;
public Solution() {
stack = new Stack<Integer>();
}
public void push(int node) {
stack.push(node);
if(stack.size() == 1) {
min = node;
} else {
findMin();
}
}
private void findMin() {
//如果值小于等于的时候,每次要找出其中的最小值
min = stack.get(0);
for(int i = 1; i < stack.size(); i++) {
min = Math.min(stack.get(i), min);
}
}
public void pop() {
int popValue = stack.pop();
if(stack.size() == 1) {
min = stack.get(0);
} else {
if(popValue <= min) {
findMin();
} else {
//值不受影响
}
}
}
public int top() {
int popValue = stack.pop();
if(stack.size() == 1) {
min = stack.get(0);
} else {
if(popValue <= min) {
findMin();
} else {
//值不受影响
}
}
return popValue;
}
public int min() {
return min;
}
}
方法二 (借用第二个栈,辅助空间解决)
import java.util.Stack;
public class Solution {
private Stack<Integer> stack;
private Stack<Integer> stack2;
private int min;
public Solution() {
stack = new Stack<Integer>();
stack2 = new Stack<Integer>();
}
public void push(int node) {
stack.push(node);
if(stack2.isEmpty()) {
stack2.push(node);
} else {
if(stack2.peek() >= node) {
stack2.push(node);
}
}
}
public void pop() {
int popValue = stack.pop();
if(popValue == stack2.peek()) {
stack2.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return stack2.peek();
}
}
网友评论