题目链接 239. 滑动窗口最大值
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
MyQueue myqueue = new MyQueue();
if(nums.length == 1) {
return nums;
}
int len = nums.length - k + 1;
int[] res = new int[len];
for(int i=0; i<k; i++){
myqueue.add(nums[i]);
}
int num = 0;
res[num++] = myqueue.peek();
for(int i=k; i<nums.length; i++){
myqueue.poll(nums[i-k]);
myqueue.add(nums[i]);
res[num++] = myqueue.peek();
}
return res;
}
}
class MyQueue{
//构造元素特定进出的队列
Deque<Integer> deque = new LinkedList<>();
//弹出元素时,判断要弹出的元素是否等于队列出口的值
void poll(int val){
if(!deque.isEmpty() && deque.peek() == val){
deque.poll();
}
}
//添加元素时,判断当前要加入的元素是否大于入口元素,如果大于则将入口元素弹出,直至当前要加入的元素小于入口元素
void add(int val){
while(!deque.isEmpty() && val > deque.getLast()){
deque.removeLast();
}
deque.add(val);
}
int peek(){
return deque.peek();
}
}
题目链接 347. 前 K 个高频元素
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(pq.size()<k){
pq.add(new int[]{entry.getKey(),entry.getValue()});
}else{
if(entry.getValue()>pq.peek()[1]){
pq.poll();
pq.add(new int[]{entry.getKey(),entry.getValue()});
}
}
}
int[] res = new int[k];
for(int i=k-1; i>=0; i--){
res[i] = pq.poll()[0];
}
return res;
}
}