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();
}