** 150. 逆波兰表达式求值 **
leetcode链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
题目描述:给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。
核心思路:逆波兰表达式求值要求遇到运算符就将最近的两个数字执行该运算,因此可以考虑栈的先进后出特性,本题测试数据较大,为防止超出界限,考虑使用long long类型的变量。
点击查看代码
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;//遇到运算符取最近的两个元素运算,因此需要使用栈
for(int i = 0;i < tokens.size();i++){
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
long long sum = 0;
if(tokens[i] == "+")sum = num2 + num1;
if(tokens[i] == "-")sum = num2 - num1;
if(tokens[i] == "*")sum = num2 * num1;
if(tokens[i] == "/")sum = num2 / num1;
st.push(sum);
}
else {
st.push(stoll(tokens[i]));//stoll将字符串整数转化为long long整值
}
}
long long result = st.top();
st.pop();
return result;
}
};
点击查看代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;//定义res存储最终结果
deque<int> que;//定义双端队列来存储窗口内的最大值的索引
for(int i = 0;i < nums.size();i++){//窗口的右边界为i,左边界为i-k+1
if(!que.empty() && que.front() <= i-k){//当队首的索引小于i-k时,索引对应的元素已出窗口,因此移除索引
que.pop_front();
}
while(!que.empty() && nums[i] > nums[que.back()]){
que.pop_back();//当前元素大于队尾索引对应的元素时,移除队尾元素,更新最大值索引
}
que.push_back(i);
if(i >= k-1){//左边界出现时,即窗口出现时
res.push_back(nums[que.front()]);
}
}
return res;
}
};
点击查看代码
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> frep;//定义哈希表
for(int num : nums){
frep[num]++;//哈希表的键为元素值,值为元素频率
}
//定义小顶堆,其中greater为比较函数
//greater比较两个pair对,优先比较第一个参数(本题传入<元素频率,元素值>)
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> heap;
for(unordered_map<int,int>::iterator it = frep.begin();it != frep.end();++it){
int num = it->first;//元素值
int cnt = it->second;//元素频率
if(heap.size() >= k){//堆大于k时比较堆顶(最小)的元素
if(cnt > heap.top().first){
heap.pop();//堆顶元素小时更新元素
heap.emplace(cnt,num);//优先传入元素频率
}
}
else{
heap.emplace(cnt,num);//不满k时,将元素加入堆中
}
}
vector<int> res;
while(!heap.empty()){
res.push_back(heap.top().second);
heap.pop();
}
return res;
}
};