目录
150. 逆波兰表达式求值
给你一个字符串数组
tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。- 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6示例 3:
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 输出:22 解释:该算式转化为常见的中缀算术表达式为: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22提示:
1 <= tokens.length <= 104
tokens[i]
是一个算符("+"
、"-"
、"*"
或"/"
),或是在范围[-200, 200]
内的一个整数
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long int> st;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
long long int num2 = st.top();
st.pop();
long long int num1 = st.top();
st.pop();
if (tokens[i] == "+") st.push(num1 + num2);
if (tokens[i] == "-") st.push(num1 - num2);
if (tokens[i] == "*") st.push(num1 * num2);
if (tokens[i] == "/") st.push(num1 / num2);
}
else
st.push(stoll(tokens[i]));
}
return st.top();
}
};
239. 滑动窗口最大值(难)
给你一个整数数组
nums
,有一个大小为k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k
个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7示例 2:
输入:nums = [1], k = 1 输出:[1]提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
class Solution {
public:
// 创建一个特殊的单调队列,可以满足求滑动窗口内最大值的需求
class MyQueue {
public:
// 底层逻辑是双向队列,保证队列前后均可进出
deque<int> que;
// 移动滑动窗口时的弹出操作
void pop(int val) {
if (!que.empty() && que.front() == val)
que.pop_front();
}
// 移动时插入新值操作
void push(int val) {
// 注意!这里只能把<val的pop,而非<=val,否则重复最大值会被删去
while(!que.empty() && que.back() < val)
que.pop_back();
que.push_back(val);
}
// 单调窗口内的最大值
int front() {
return que.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
MyQueue que;
for (int i = 0; i < k; i++) {
que.push(nums[i]);
}
ans.push_back(que.front());
for (int i = k; i < nums.size(); i++) {
que.pop(nums[i-k]);
que.push(nums[i]);
ans.push_back(que.front());
}
return ans;
}
};