今日收获:逆波兰表达式求值,滑动窗口最大值,前K个高频元素,栈和队列的总结
1. 逆波兰表达式求值
题目链接:150. - 力扣(LeetCode)
思路:借助栈。遍历字符串数组,遇到数字就压入栈,遇到运算符就连续弹出连个数字做运算,再把结果压入栈中
方法:
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack=new Stack<>();
Integer num1=0;
Integer num2=0;
for (String token:tokens){
if (token.equals("+")){
num1=stack.pop();
num2=stack.pop();
stack.push(num1+num2);
}else if (token.equals("-")){
num1=stack.pop();
num2=stack.pop();
stack.push(num2-num1);
}else if (token.equals("*")){
num1=stack.pop();
num2=stack.pop();
stack.push(num1*num2);
}else if (token.equals("/")){
num1=stack.pop();
num2=stack.pop();
stack.push(num2/num1);
}else {
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
}
总结:做运算的数字总是离运算符最相邻的两个数字,可以判断使用栈这种数据结构。另外要注意元素的运算顺序,是第二个出栈的元素除以/减去第一个出栈的元素。
2. 滑动窗口最大值
题目链接:239. - 力扣(LeetCode)
一刷了解思路:涉及单调队列的思想。滑动窗口类似与队列的结构,每次移动队尾添加元素,队头移除元素,而队列中的最大值始终在队列的出口处就是单调队列(以单调减队列为例)。所以每次添加元素时,将队列中小于当前值的元素全部移除,就可以维护一个单调队列。
二刷时一定啃得动!
3. 前K个高频元素
题目链接:347. - 力扣(LeetCode)
一刷了解思路:涉及优先级队列(其内部基于大顶堆或小顶对实现)。首先利用map存储每个元素及其出现的频率,然后利用优先级队列对频率进行排序。如果是大顶堆优先队列,遍历所有元素取前k个队头元素;如果是小顶堆优先队列,当队列元素小于k时直接添加新元素,否则需要和队头元素比较,大于队头元素时弹出队头元素再添加,小于就不用添加了。
二刷时一定啃得动!
4. 栈和队列的总结
(1)栈:适合消除相邻元素,或者匹配之前的元素
(2)队列:单调队列和优先级队列适合求最大/小值或取前几个最大/小值,和最值相关