代码随想录算法训练营Day13|栈与队列part03
一、239. 滑动窗口最大值(好难)
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n=nums.length;
int re[]=new int[n-k+1];
ArrayDeque<Integer> ad=new ArrayDeque<>();
int index=0;
for(int i=0;i<n;i++){
while(!ad.isEmpty()&&ad.peek()<(i-k+1)){
ad.poll();
}
while(!ad.isEmpty() && nums[ad.peekLast()] < nums[i]) {
ad.pollLast();
}
ad.offer(i);
if(i >= k - 1){
re[index++] = nums[ad.peek()];
}
}
return re;
}
}
二、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)->pair2[1]-pair1[1]);
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
pq.add(new int[]{entry.getKey(),entry.getValue()});
}
int[] ans = new int[k];
for(int i=0;i<k;i++){
ans[i] = pq.poll()[0];
}
return ans;
}
}