代码随想录算法训练营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;
    }
};
相关推荐
reikocao27 分钟前
大场景下 Hessian 特征值放大与退化检测
算法
hetao173383732 分钟前
2026-09-18 hetao1733837 的刷题记录
c++·算法
wuyk5551 小时前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
Rabitebla1 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
库玛西1 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
木井巳1 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
东方护航数据恢复(深圳)1 小时前
本地小算力设备数据恢复经典案例实操全解_东方护航数据恢复深圳店
大数据·服务器·算法·ai·gpu算力
Omics Pro1 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
Y幽谷客2 小时前
图像识别入门习题整理
算法
点纭2 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#