7.24day13

239. 滑动窗口最大值 - 力扣(LeetCode)

首先要学习一个单调队列 自己理解了一下大概意思是:

 如果要找滑动窗口中的最大值首先要让队列里的数变成单调的序列然后删除小的数(保留大的数)即可

  如:

[1,3,-1,-3,5,3,6,7]

加入队列的过程为:

 

 一:建立一个push的新函数 把小的数pop掉 大的数放进去

为什么会是removelast 删除队尾不删除对头呢?

因为要解决这样的情况 514 如果是删除队头只会跟5去比较 后面的数就放不进去了

 这样就可以维护某个数在区间内一段时间的最大值 比如说 :1 3 -1 Max=3;3 -1 -3 Max=3;

二:建立一个pop元素模拟窗口移动

 因为某个值在窗口中只能是一段时间内的最大值 

当滑动窗口过了这个值 该最大值就要被pop出去

 只要边缘移动到改值 就被pop掉

最后就把队头元素输出就行了

放入 nums[i-k] 是把窗口最左边的数删除(先判断再删除)





347. 前 K 个高频元素 - 力扣(LeetCode)

分为三步

收集数字的频率

 for(int num:nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }

对数字进行按频率排序

PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);

输出前k个数字

 for(int i=0;i<k;i++){//依次从队头弹出k个,就是出现频率前k高的元素
            ans[i] = pq.poll()[0];
        }

整体代码为:

 lamba表达式对于优先队列的排序不太熟练 要多练

(30条消息) Java优先队列/堆(PriorityQueue)中3种重写compare的方法_重写compare方法_hellosc01的博客-CSDN博客

(30条消息) 使用Lambda简化Comparator的使用_CrazyDragon_King的博客-CSDN博客

每日一题:

771. 宝石与石头 - 力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值