- 239. 滑动窗口最大值
维护一个单调递减的栈,保证头元素是最大的
单调栈模板:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
int idx = 0;
for (int i = 0; i < nums.length; i++) {
//去除不在队列里的元素,元素index在[i - k + 1, i]之间
while(!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
deque.poll();
}
//去除队尾比当前数字小的元素
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.removeLast();
}
//把当前元素入栈
deque.offer(i);
if (i + 1 >= k) {
res[idx++] = nums[deque.peek()];
}
}
return res;
}
}
- 347.前 K 个高频元素
用的最大堆,会有面试问题minHeap和maxHeap的区别,以及哪个会好一些,其实用minHeap会更优化,因为maxHeap每取一个元素都要hepify一次
Time: n(logN)
Space: O(n)
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
map.put(n, map.getOrDefault(n, 0) + 1);
}
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((a, b) -> (b.getValue() - a.getValue()));
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
pq.add(entry);
}
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = pq.poll().getKey();
}
return res;
}
}
- 总结