239. 滑动窗口最大值
单调队列的思路。值得二刷
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res = new int[nums.length - k + 1];
int index = 0;
Deque<Integer> deque = new LinkedList<>();
for (int i = 0; i < k; i++) {
int cur = nums[i];
// add the new number into the deque
while (!deque.isEmpty() && deque.getLast() < cur) {
deque.removeLast();
}
deque.offer(cur);
}
res[index++] = deque.peek();
for (int i = k; i < nums.length; i++) {
int cur = nums[i];
// add the new number into the deque
while (!deque.isEmpty() && deque.getLast() < cur) {
deque.removeLast();
}
deque.offer(cur);
// check whether we should remove the first number
if (!deque.isEmpty() && deque.peek() == nums[i - k]) {
deque.removeFirst();
}
// put the largest one to the res array
res[index++] = deque.peek();
}
return res;
}
}
347.前 K 个高频元素
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
// build a min heap
PriorityQueue<int[]> pq = new PriorityQueue<>(
(p1, p2)->p1[1] - p2[1]
);
for (int key : map.keySet()) {
if (pq.size() < k) {
pq.offer(new int[]{key, map.get(key)});
} else {
if (pq.peek()[1] < map.get(key)) {
pq.poll();
pq.offer(new int[]{key, map.get(key)});
}
}
}
int[] res = new int[k];
int index = 0;
while (!pq.isEmpty()) {
res[index++] = pq.poll()[0];
}
return res;
}
}