设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。
示例:
1 2 3 4 5 6 7 8
MinStack minStack = new MinStack(); minStack.push(-2 ); minStack.push(0 ); minStack.push(-3 ); minStack.getMin(); --> 返回 -3 . minStack.pop(); minStack.top(); --> 返回 0 . minStack.getMin(); --> 返回 -2 .
思路1
可以用两个栈,一个栈用来维护当前栈内最小的元素,一个栈用来维度当前栈内的元素。
属于投机取巧的方法。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
class { private Stack<Integer> stack; private Stack<Integer> minStack; public () { stack = new Stack<>(); minStack = new Stack<>(); } public void push (int x) { stack.push(x); if (minStack.isEmpty() || x <= minStack.peek()){ minStack.push(x); } } public void pop () { if (stack.peek().equals(minStack.peek())){ minStack.pop(); } stack.pop(); } public int top () { return stack.peek(); } public int getMin () { return minStack.peek(); } }
思路2
自己用数组实现元素栈与存储最小元素的栈。
要点,数组的自动扩容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
class { private int [] minValue; private int [] data; private int index; public () { minValue = new int [10 ]; data = new int [10 ]; index = -1 ; } public void push (int x) { if (++index>data.length-1 ) resize(); data[index] = x; if (index==0 || x <minValue[index-1 ]){ minValue[index]=x; }else { minValue[index] = minValue[index-1 ]; } } public void pop () { index--; } public int top () { return data[index]; } public int getMin () { return minValue[index]; } public void resize () { int [] newdata = new int [data.length*2 ]; int [] newMinValue = new int [data.length*2 ]; System.arraycopy(data,0 ,newdata,0 ,data.length); System.arraycopy(minValue,0 ,newMinValue,0 ,minValue.length); data = newdata; minValue = newMinValue; } }
或者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
class { private int minValue; private int [] data; private int index; public MinStack () { minValue = Integer.MAX_VALUE; data = new int [10 ]; index = -1 ; } public void push (int x) { if (++index>data.length-1 ) data = Arrays.copyOf(data, data.length*2 ); data[index] = x; if (x < minValue){ minValue = x; } } public void pop () { index--; if (data[index+1 ]==minValue){ minValue = Integer.MAX_VALUE; for (int i=0 ; i<=index; i++){ if (data[i]<minValue){ minValue = data[i]; } } } } public int top () { return data[index]; } public int getMin () { return minValue; } }
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/min-stack 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
近期评论