代码随想录算法训练营DAY11第五章 栈与队列part02

目录

[150. 逆波兰表达式求值](#150. 逆波兰表达式求值)

[239. 滑动窗口最大值](#239. 滑动窗口最大值)

[347. 前 K 个高频元素](#347. 前 K 个高频元素)


150. 逆波兰表达式求值

string转int方法:stk.push(stoi(t));

cpp 复制代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> stk;
        for (string& t : tokens) {
            if(t=="+"||t=="-"||t=="*"||t=="/") {
                int b = stk.top();stk.pop();
                int a = stk.top();stk.pop();
                if (t == "+") stk.push(a + b);
                else if (t == "-")stk.push(a-b);
                else if(t=="*")stk.push(a*b);
                else stk.push(a/b);
            }
            else stk.push(stoi(t));
        }
        return stk.top();
    }
};

239. 滑动窗口最大值

优先队列

cpp 复制代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        priority_queue<pair<int,int>> q;
        vector<int> ans;
        for(int i=0;i<k;i++){
            q.emplace(nums[i],i);
        }
        ans.push_back(q.top().first);
        for(int i=k;i<nums.size();i++){
            q.emplace(nums[i],i);
            while(q.top().second<=i-k){
                q.pop();
            }
            ans.push_back(q.top().first);
        }
        return ans;
    }
};

单调队列(双端队列)

cpp 复制代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> q;
        vector<int> ans;
        for (int i = 0; i < k; i++) {
            while (!q.empty() && nums[i] >= nums[q.back()]) {
                q.pop_back();
            }
            q.push_back(i);
        }
        ans.push_back(nums[q.front()]);
        for (int i = k; i < nums.size(); i++) {
            while (!q.empty() && nums[i] >= nums[q.back()]) {
                q.pop_back();
            }
            q.push_back(i);
            while (q.front() <= i - k) {
                q.pop_front();
            }
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};

347. 前 K 个高频元素

哈希表

cpp 复制代码
class Solution {
    static bool com(pair<int, int>& a, pair<int, int>& b) {
        return a.second > b.second;
    }
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> map;
        for (int t : nums) {
            map[t]++;
        }
        vector<pair<int, int>> gra;
        for (auto& [key, value] : map) {
            gra.push_back({key, value});
        }
        sort(gra.begin(), gra.end(), com);
        vector<int> ans;
        for (int i = 0; i < k; i++) {
            ans.push_back(gra[i].first);
        }
        return ans;
    }
};

哈希表+桶排序

cpp 复制代码
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> map;
        for(int t:nums){
            map[t]++;
        }
        vector<vector<int>> bucket(nums.size()+1);
        vector<int> ans;
        for(auto& [key,value]:map){
            bucket[value].push_back(key);
        }
        for(int i=nums.size();i>=1&&ans.size()<k;i--){
            for(int x:bucket[i]){
                ans.push_back(x);
            }
        }
        return ans;
    }
};
相关推荐
IronMurphy1 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬1 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership2 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826522 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u2 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
_深海凉_5 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
旖-旎6 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰6 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx6 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer7 小时前
【无标题】
开发语言·c++·算法