- 239. 滑动窗口最大值 Sliding Window Maximum - LeetCode
出口维护的是最大值,
要双端栈口用Deque
pop(int val)
if(!queue.isEmpty( )&& val == queue.front)//说明左边要遗弃的是滑动窗口里面的最大值
queue.popFont();
push(int val)
if (!queue.isEmpty() && val > queue.back
queue.popback();//把后面元素全部弹出
queue.offerLast(i)
感觉教学视频还是没看懂。。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return new int[0];
}
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length + 1 - k];
for (int i = 0; i < nums.length; i++) {
if (!deque.isEmpty() && deque.peekFirst() == i - k) {
deque.poll();
}
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.removeLast();
}
deque.offerLast(i);
if ((i + 1) >= k) {
res[i + 1 - k] = nums[deque.peek()];
}
}
return res;
}
}
- 347.前 K 个高频元素 Top K Frequent Elements - LeetCode
面试高频题,之前亚麻面的时候问题是MaxHeap和minHeap的区别,以及为什么要选MaxHeap
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) ->(a.getValue() - b.getValue()));
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
pq.add(entry);
if (pq.size() > k) {
pq.poll();
}
}
int[] res = new int[k];
for (int i = res.length - 1; i >= 0; i--) {
res[i] = pq.poll().getKey();
}
return res;
}
}
所以这次为什么我又用了minHeap?要想一想为什么这么选择,选这个优缺点是什么