算法训练营第13天|239. 滑动窗口最大值 347.前 K 个高频元素 总结

239. 滑动窗口最大值

一.思路

自己创建一个列表。这个列表可以弹入元素,弹出元素,获取列表最大值。因为只要求最大值,所以不需要维护列表中的所有元素

1.弹入列表设计

弹入元素为a,列表尾部元素为b;

如果a<b,从尾部弹出b,直到列表空或者a>=b;

a从列表尾部进入。

2.弹出列表设计

如果列表头的元素等于要弹出的元素,那么弹出,否则不动

3.获取列表最大值

列表头元素

二.需要使用的数据结构

双向列表,两边都可以操作。

Deque<Integer> queue = new LinkedList<>();

三.返回结果使用的数据结构

如果已知结果长度(比如这道题),可以直接使用数组

如果不知道结果长度,用ArrayList,一个一个加完后再一个一个转为数组元素

ArrayList<Integer> result=new ArrayList<>();
int[] ret=new int[result.size()];
for(int i=0;i<result.size();i++)
{
    ret[i]=(int) result.get(i);
}

347.前 K 个高频元素

1.如何统计频率:用map

Map<Integer,Integer> map = new HashMap<>();
for(int num:nums)
{
    map.put(num,map.getOrDefault(num,0)+1);
}

2.如何用堆去解决k个高频

用小顶堆,因为pop最小的元素,所有遍历一遍之后,堆中留下较大的k个元素。

容器适配器就是优先级队列,优先级队列默认为是小顶堆,可以通过写lambda表达式将其设置为大顶堆,下面是小顶堆书写方式。

PriorityQueue<int[]> pq = new PriorityQueue<>(((o1, o2) -> (o1[1]-o2[1])));

以下为如何遍历map的方法,即使用entrySet()将map转化为set,然后通过getKey(),getValue()得到相应的值。

for(var key:map.entrySet())
{
    int[] temp=new int[2];
    temp[0]=key.getKey();
    temp[1]=key.getValue();
    pq.offer(temp);           
    if(pq.size()>k)
       pq.poll();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值