150. 逆波兰表达式求值 - 力扣(LeetCode)
一看这种题首先想到的是栈,然后这道题容易犯的错误是 谁是被除数和除数,有人直接把第一个元素当成大的那个,其实是第二个。我就是因为这个错误一直运行失败。
然后还有就是入栈的时候把string类型变成int类型
#include <stack>
#include <vector>
#include <string>
#include <cstdlib> // For std::stoi
class Solution {
public:
int evalRPN(vector<string>& tokens) {
std::stack<int> sta;
for(int i = 0; i < tokens.size(); i++){
if(sta.size() > 1 && tokens[i] == "*"){
int b = sta.top();
sta.pop();
int a = sta.top();
sta.pop();
sta.push(a * b);
}
else if(sta.size() > 1 && tokens[i] == "+"){
int b = sta.top();
sta.pop();
int a = sta.top();
sta.pop();
sta.push(a + b);
}
else if(sta.size() > 1 && tokens[i] == "-"){
int b = sta.top();
sta.pop();
int a = sta.top();
sta.pop();
sta.push(a - b);
}
else if(sta.size() > 1 && tokens[i] == "/"){
int b = sta.top();
sta.pop();
int a = sta.top();
sta.pop();
sta.push(a / b); // 注意这里会进行整数除法
}
else {
sta.push(stoi(tokens[i])); // 使用stoi将字符串转换为int
}
}
return sta.top();
}
};
有重复的代码 可以换一种方式过滤掉。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
// 力扣修改了后台测试数据,需要用longlong
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();
if (tokens[i] == "+") st.push(num2 + num1);
if (tokens[i] == "-") st.push(num2 - num1);
if (tokens[i] == "*") st.push(num2 * num1);
if (tokens[i] == "/") st.push(num2 / num1);
} else {
st.push(stoll(tokens[i]));
}
}
int result = st.top();
st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
return result;
}
};
239. 滑动窗口最大值 - 力扣(LeetCode)
这道题用队列,每次循环一次进行push,pop操作,push操作把比他小的还在他前面的都pop掉,因为我们取最大值取队列的首元素就行了,pop操作则是按位次决定的而不是光pop队首元素如果队首恰好是那一位则直接pop出去。
class Solution {
private:
class MyQueue{
public:
deque<int> deq;
void pop(int val){
if(!deq.empty() && deq.front() == val){
deq.pop_front();
}
}
void push(int val){
while(!deq.empty() && deq.back()<val){
deq.pop_back();
}
deq.push_back(val);
}
int front(){
return deq.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue deq;
vector<int> res;
for(int i =0 ;i<k; i++){
deq.push(nums[i]);
}
res.push_back(deq.front());
for(int i =k; i<nums.size(); i++){
deq.pop(nums[i-k]);
deq.push(nums[i]);
res.push_back(deq.front());
}
return res;
}
};
347. 前 K 个高频元素 - 力扣(LeetCode)
优先级队列的运用
class Solution {
public:
class cmp{
public:
bool operator()(const pair<int,int> &lhs,const pair<int,int> &rhs){
return lhs.second >rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(int i =0; i<nums.size();i++){
map[nums[i]]++;
}
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pri_que;
for(unordered_map<int,int>::iterator it = map.begin(); it!=map.end(); it++){
pri_que.push(*it);
if(pri_que.size() > k){
pri_que.pop();
}
}
vector<int>res;
for(int i = k -1; i>=0; i--){
res.push_back(pri_que.top().first);
pri_que.pop();
}
return res;
}
};