150. 逆波兰表达式求值
题目链接:. - 力扣(LeetCode)
思路:栈的应用,逆波兰表达式是把操作符放到两个操作数的后面
解的时候用栈把数压入栈,遇到操作符就取头两个元素进行计算并压栈.
239. 滑动窗口最大值(理解)
题目链接:. - 力扣(LeetCode)
思路:滑动窗口是有一个长度为k的框子,在数组上移动,求他在移动过程中的最大值
这道题主要是对队列的应用,在窗口移动过程中,窗口中的最大值可能会变,一般做法需要进行查找,找到最大值,这样算法复杂度就到O(n^2)了.
这里窗口滑动的时候,一边进入元素,一边出来元素,而且可以获取队列的最大值,想到用队列实现,这里是单调队列
这个队列就用Deque来实现,双端队列,他可以操作首尾的元素
class MyQueue{
这里这个队列就是滑动的窗口,
下面模拟的是滑动窗口滑动的过程以及取最大值操作
Deque<Integer> deque = new LinkedList<>();
这里进行删除元素,也就是删除最左边的元素;
删除的时候有点小的没有意义的数已经在添加时删掉了,
所以这里进行判断要删除的是否还在(也就是和队头的进行比较看是否相等),
相等代表还在,就删除掉
void poll(int val){
if(!deque.isEmpty()&&val==deque.peek()){
deque.poll();
}
}
添加操作是精髓所在,往里面添加时如果里面有元素,
就判断最后的那个和要添加到大小,如果是小的话直接删除,
因为他在该滑动窗口的前面,而且比滑动窗口后面的一个数小,该删!!
void add(int val){
if(!deque.isEmpty()&&val>deque.getLast()){
deque.removeLast();
}
deque.add(val);
}
这样,队头的那个元素,一直维护为最大值
int getMax(){
return deque.peek();
}
}
347.前 K 个高频元素(理解)
题目链接:. - 力扣(LeetCode)
思路:这里用到一个新东西,小顶堆,大顶堆;小顶堆--顶部是比两个孩子小;大顶堆--顶部比两个孩子大
求前k个高频元素,首先用map存入这些数,常用操作 --- mp.put(xx,getOrDefault(xx,0)+1) ;
1. 然后用大顶堆将mp的key,value全放进去,取前k个即可
2. 或者用小顶堆,维护小顶堆为k个,最后组装数组返回.
遍历map: Map.Entry<Integer,Integer>是一个key,value集合
Map.EntrySet是所有key,value集合
keySet是所有key的集合