LeetCode 239 滑动窗口的最大值
这里我们使用双端队列来辅助我们完成滑动窗口的移动,我们用这个双端队列来储存最大值在数组中的位置。这样我们能够清除的知道这个位置是否处于滑动窗口当中。
在循环的过程中,我们往双端队列中增加数据时,我们需要首先判断目前的最大值是否在滑动窗口的范围中,如果不在我们需要从双端队列的尾部移除该元素。
然后我们需要判断这个值和双端队列首部的元素依次比较大小,如果前面的数比该数要小,则从双端队列首部移除元素,直至双端队列中没有元素或者前面的元素要大于该增加元素。
从首部增加元素,最后把双端队列中的结果储存到结果中
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
ArrayDeque<Integer> deque = new ArrayDeque<>();
int n = nums.length;
int[] res = new int[n - k + 1];
int idx = 0;
for(int i=0;i<n;i++){
while(!deque.isEmpty() && deque.peek()<i-k+1){
deque.poll();
}
while(!deque.isEmpty()&&nums[deque.peekLast()]<nums[i]){
deque.pollLast();
}
deque.offer(i);
if(i>=k-1){
res[idx++] =nums[deque.peek()];
}
}
return res;
}
}
LeetCode 347 前K个高频元素
这题主要考察了对于大顶堆和小顶堆的理解和使用。
建议每天都做1-2题大顶堆和小顶堆
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;
}