今日内容:
● 239. 滑动窗口最大值
● 347.前 K 个高频元素
今天还是栈和队列的练习,这两道题都是高频题
239. 滑动窗口最大值
定义一个单调递减队列,然后填充这个自定义队列,然后从i=k开始遍历即可
class Solution {
class MyQueue {
Deque<Integer> deque;
public MyQueue(){
deque = new LinkedList<>();
}
private void add(int num) {
while(!deque.isEmpty() && deque.peekLast() < num) {
deque.removeLast();
}
deque.addLast(num);
}
private void poll(int num) {
if(!deque.isEmpty() && deque.peekFirst() == num) {
deque.removeFirst();
}
}
private int peek() {
return deque.peekFirst();
}
private boolean isEmpty() {
return deque.isEmpty();
}
}
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length == 0)return new int[0];
if(nums.length == 1)return nums;
int len = nums.length;
int[] res = new int[len - k + 1];
MyQueue myQueue = new MyQueue();
for(int i = 0; i < k; i++) {
myQueue.add(nums[i]);
}
int index = 0;
res[index++] = myQueue.peek();
for(int i = k; i < len; i++) {
myQueue.poll(nums[i-k]);
myQueue.add(nums[i]);
res[index++] = myQueue.peek();
}
return res;
}
}
347. 前 K 个高频元素
这道题可以用优先队列也就是堆,也可以用快速排序来做 我在这里用优先队列来做
class Solution {
public int[] topKFrequent(int[] nums, int k) {
//统计频率
HashMap<Integer, Integer> map = new HashMap<>();
for(int num : nums) {
if(map.containsKey(num)) {
map.put(num, map.get(num) + 1);
} else {
map.put(num, 1);
}
}
//构建小顶堆
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return map.get(o1) - map.get(o2);
}
});
for(int key : map.keySet()) {
if(pq.size() < k) {
pq.add(key);
} else if(map.get(key) > map.get(pq.peek())) {
pq.remove();
pq.add(key);
}
}
//转换为数组
int[] res = new int[k];
int i = 0;
while (!pq.isEmpty()) {
res[i++] = pq.remove();
}
return res;
}
}