代码随想录算法训练营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;
    }
};
相关推荐
裕晟资质规划8 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
en.en..9 小时前
C语言 标准输入 / 输出缓冲区
算法
吃好睡好便好11 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球11 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
靠沿12 小时前
贪心算法专题(二)
算法·贪心算法
猎头南楼13 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生14 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂14 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康14 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备15 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法