目录
LeetCode 239. 滑动窗口最大值
文章讲解:代码随想录
思路:
1.这里需要注意三个关键的变量。一个是nums数组,一个是自己构造的队列deque,一个是接收结果的res数组。
2.搞明白题目的意思。限制条件:k值大小的窗口,窗口的移动范围;要求:在窗口移动的过程中,返回窗口内的最大值。
3.构建单调队列。需要注意的是这里的poll方法,需要队列不为空且val值要和队列的值相等才能够使用。同样的add方法也是需要队列不为空且val值大于队列尾部的值这种限制条件来保证队列成单调性。
4.最后在使用单调队列的过程中,先给一组窗口里面的值给队列deque,那么根据自己构造的队列的方法,此时队列deque里面的值就会呈现单调性。紧接着,进行移动的操作和记录结果的操作。
代码如下:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 1) return nums;
int len = nums.length - k + 1;
int[] res = new int[len];
int num = 0;
MyQueue myQueue = new MyQueue();
for(int i = 0; i < k; i++){
myQueue.add(nums[i]);
}
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() && val == deque.peek()){
deque.poll();
}
}
void add(int val){
while(!deque.isEmpty() && val > deque.getLast()){
deque.removeLast();
}
deque.add(val);
}
int peek(){
return deque.peek();
}
}
LeetCode 347.前k个高频元素
文章讲解:代码随想录
视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili
力扣题目:LeetCode 347.前k个高频元素
代码如下(Java):
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;
}
}