239. 滑动窗口最大值
视频链接:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili
文章链接:代码随想录
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路
定义一个拥有出、入,弹出头元素三个方法的自定义队列。遍历数组。
出方法:判断头元素与遍历到的数组中的元素一不一样,一样就弹出。
入方法:如果加入的元素比前面的元素大,就弹出前面的元素再加入。
代码
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;//用于指向结果数组的指针
MyQuene quene=new MyQuene();
//先将前k个元素放入队列,然后将求出的值放入结果数组
for(int i=0;i<k;i++){
quene.add(nums[i]);
}
res[num++]=quene.peek();
for(int i=k;i<nums.length;i++){
//判断是否该将头元素清除,传入的是该窗口的头元素
quene.poll(nums[i-k]);
//加入最后的元素
quene.add(nums[i]);
//记录最大值
res[num++]=quene.peek();
}
return res;
}
}
//自定义队列(单调队列)
class MyQuene{
Deque<Integer> deque=new LinkedList<>();
//出队列,val为当前指针所指的数组元素
void poll(int val){
//peek()获取头元素
//对出口处的值做比较(右)
if(!deque.isEmpty()&&val==deque.getFirst()){
deque.poll();
}
}
void add(int val){
while(!deque.isEmpty()&&deque.getLast()<val){
deque.removeLast();
}
deque.add(val);
}
int peek(){
return deque.peek();
}
}
347.前 K 个高频元素
视频链接:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili
文章链接:代码随想录
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
关键字
var 可以变成任意类型
思路
用map来统计个数,用优先级队列来排序
代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);//Lamda表达式1-2为从小到大,反之
Map<Integer,Integer>map=new HashMap<>();//key为元素值,value为出现次数
int res[]=new int[k];//答案数组有k个元素
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);//getOrDefault如果key(num)存在就返回它的值,不存在返回所给默认值(0)
}
// entrySet 获取 k-v Set 集合x
//用数组保存拿到的值
for(var x:map.entrySet()){
int[]temp=new int[2];
temp[0] = x.getKey();
temp[1] = x.getValue();
pq.offer(temp);
if(pq.size()>k)
pq.poll();
}
for(int i = 0; i < k; i ++) {
res[i] = pq.poll()[0]; // 获取优先队列里的元素
}
return res;
}
}
这题没理解透
总结
学习了三个小时。还是不太理解优先级队列这道题。
章节总结
本章学习了栈的应用和队列的应用,队列的应用对我来说难理解一点。