【算法方法总结·六】栈队列堆的一些技巧和注意事项
- 【算法方法总结·一】二分法的一些技巧和注意事项
- 【算法方法总结·二】双指针的一些技巧和注意事项
- 【算法方法总结·三】滑动窗口的一些技巧和注意事项
- 【算法方法总结·四】字符串操作的一些技巧和注意事项
- 【算法方法总结·五】链表操作的一些技巧和注意事项
- 【算法方法总结·六】栈队列堆的一些技巧和注意事项 🎯
【栈】
可以用 Stack
,但是一般用 Deque
,比较方便
Stack
1 2 3 4 5 6 7 8
| Stack<Integer> stack = new Stack<>()
stack.pop() stack.push(x) stack.peek() stack.isEmpty() stack.isFull() stack.length
|
Deque
也支持 栈操作

1 2 3 4 5 6 7 8 9
| Deque<Integer> deque = new Linkedlist<>()
pop():removeFirst() push():addFirst() peek():peekFirst() poll():pollFirst() offer(x):offerLast(x)
|
【单调栈】
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
| class Solution { public int trap(int[] height) { Deque<Integer> st = new LinkedList<>(); int len = height.length; st.push(0); int res = 0; for (int i = 1; i < len; i++) { if (height[i] < height[st.peek()]) { st.push(i); } else if (height[i] == height[st.peek()]) { st.pop(); st.push(i); } else { while (!st.isEmpty() && height[i] > height[st.peek()]) { int mid = st.pop(); if (!st.isEmpty()) { int left = st.peek(); int h = Math.min(height[i], height[left]) - height[mid]; int w = i - left - 1; int hold = h * w; res += hold; } } st.push(i); } } return res; } }
|
【队列堆】
普通队列
Queue
是个接口,在实例化时必须实例化 LinkedList
的对象,因为 LinkedList
实现了 Queue
接口
1 2 3 4 5 6 7
| Queue<Integer> queue = new LinkedList<>();
queue.size() queue.peek() / queue.element() queue.poll() / queue.remove() queue.offer(x) / queue.add(x) queue.isEmpty()
|
双端队列
Deque
是一个接口,使用时必须创建 LinkedList
的对象(一般不用 ArrayDeque
),它也支持 Queue
的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Deque<Integer> stack = new ArrayDeque<>(); Deque<Integer> queue = new LinkedList<>();
addFirst() / offerFirst() removeFirst() / pollFirst() getFirst() / peekFirst()
pop():removeFirst() push():addFirst() peek():peekFirst() poll():pollFirst() offer(x):offerLast(x)
|
优先队列【即为堆】
PriorityQueue
默认情况下是小根堆 —— 即每次获取到的元素都是最小的元素
1 2
| PriorityQueue<Integer> q1 = new PriorityQueue<>();
|
3 种 大根堆 自定义方式
方法一
1 2 3 4 5 6 7 8 9
|
class IntCmp implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } } PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp());
|
方法二
1 2 3 4 5 6
| PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() { public int compare(int[] o1, int[] o2) { return o2[1] - o1[1]; } });
|
方法三:Lambda 表达式 (推荐)
1 2
| PriorityQueue<int[]> p = new PriorityQueue<>((pair1, pair2) -> pair2[1] - pair1[1]);
|
堆操作
1 2 3 4 5 6
| size() offer() / add() peek() poll() / remove() clear() isEmpty()
|
相关力扣题