LeetCode155-最小栈(优先队列/巧妙的解法)
看起来挺简单,但是写起来才有坑。
模仿java里面的栈
1、用数组存放元素
2、设置size和index,push和pop只需要移动index就好了,不需要处理元素。
3、初始化为16,如果满了要扩容到2倍,为了偷懒,数组只增不减。
最后就是处理min的问题,原来想着提供一个min变量,每次插入的时候更新min即可。
但是如果刚好pop了一个min呢?上一个min是多少?
当然可以使用一个secondMin变量,但是连续pop两个呢?上上个呢?
所以使用变量不行。
因为只需要在获取的时候是常数,维护min不做限制,那么使用优先队列就好了。
注意在pop的时候,要注意pop的是不是最小值,是的话有限队列也要poll
没进行出错处理,比如pop到负数,但是题目本身也没这样的操作。过了
class MinStack { int size; int index; //只有一个min,或者两个min,不能实现该功能 //如果pop了一个min,没法获取之前的最小值了 //使用最小堆就好了 PriorityQueue<Integer> min; int [] array; /** initialize your data structure here. */ // 初始化给16 public MinStack() { size = 16; index = 0; array = new int [16]; min = new PriorityQueue<>(); } public void push(int x) { //扩容 if(index==size-1){ size*=2; int [] temp = new int [size]; int ori = size/2; for(int i=0;i<ori;i++){ temp[i]=array[i]; } array = temp; } array[index++]=x; min.add(x); } public void pop() { int temp = array[--index]; //如果pop掉的是最小值,那么队列也要删掉一个最小值 if(temp==getMin()){ min.poll(); } } public int top() { return array[index-1]; } public int getMin() { return min.peek(); } }
排第一的答案很有趣!是自定义的数据结构来维护min值!
使用了一个栈来保存Pair
Pair是当前值val对应的min值
每次push的时候更新min值,然后创建Pair,压栈
因为用的是栈,就算是同一个数字,后入和先入的也能区分不同的min。
而且这个栈st和题目要求的栈刚好可以同步pop,也算巧妙吧!