题目150. 逆波兰表达式求值 - 力扣(LeetCode)
class Solution {
public:
int evalRPN(vector<string>& tokens) {
//使用栈来消除
stack<string> st;
for(int i=0;i<tokens.size();i++)
{
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
string op=tokens[i];
int num1=atoi(st.top().c_str());
st.pop();
int num2=atoi(st.top().c_str());
st.pop();
int res=0;
if(tokens[i]=="+")
{
res=num1+num2;
}else if(tokens[i]=="-")
{
res=num2-num1;
}else if(tokens[i]=="*")
{
res=num1*num2;
}else{
res=num2/num1;
}
string ress=to_string(res);
st.push(ress);
}else{
st.push(tokens[i]);
}
}
return atoi(st.top().c_str());
}
};
题目239. 滑动窗口最大值 - 力扣(LeetCode)
class Solution {
public:
class myqueue // 单调队列最前面的就是最大的数字
{
deque<int> que;
public:
void push(
int val) // 有序单调序列,加入元素与最后一个最小的元素比较,要是比他小正常插入,如果比他大就pop出去
{
while (!que.empty() && val > que.back()) {
que.pop_back();
}
que.push_back(val);
}
void pop(int val) { // 直到队列中的首部的元素等于要弹出的区间元素,才弹出
if (!que.empty() && val == que.front()) {
que.pop_front();
}
}
int front() { return que.front(); }
bool empty() { return que.empty(); }
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
// 单调队列
myqueue que;
vector<int> res;
// 滑动窗口
int left = 0;
int right = left; // 左闭右闭
while (right <= nums.size()) {
while (right < k) {
que.push(nums[right]);
right++;
}
res.push_back(que.front());
if (!que.empty()) {
que.pop(nums[left]);
}
left++;
if (right < nums.size()) {
que.push(nums[right]);
}
right++;
}
return res;
}
};
题目347. 前 K 个高频元素 - 力扣(LeetCode)
class Solution {
public:
// 自定义比较
class Compar {
public:
bool operator()(const pair<int, int>& p1, const pair<int, int>& p2) {
return p1.second > p2.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
// 先进行出现频次的记录到map中,然后用优先级队列进行符合条件的k个排序,要用小根堆进行排序
unordered_map<int, int> map;
for (auto e : nums) {
map[e]++;
}
// 优先级队列
// 优先级队列默认大根堆,每次pop出的都是当前优先级队列中最大的那个元素,如果要改成小根堆,自定义类型的排序需要传仿函数
/*template <class T, //存储元素类型
class Container = vector<T>,//优先队列底层使用的存储结构
class Compare = less<typename Container::value_type>
>//定义优先队列中元素的比较方式的类 class priority_queue; */
priority_queue<pair<int, int>, vector<pair<int, int>>, Compar> pri_que;
for (auto& e : map) {
if (pri_que.size() > k) {
pri_que.pop();
}
pri_que.push(e);
}
if (pri_que.size() > k) {
pri_que.pop();
}
vector<int> vec(k, 0);
for (int i = vec.size() - 1; i >= 0; i--) {
vec[i] = pri_que.top().first;
pri_que.pop();
}
return vec;
}
};
最后
栈很适合用来最近的元素进行消除工作
单调队列用deque实现,deque要再熟悉一下,滑动窗口还需熟悉
优先级队列,是默认大根堆,小根堆需要额外传入比较仿函数类的对象
对运算符重载有点忘记了,需要加强