代码随想录算法训练营第11天|150. 逆波兰表达式求值、 239. 滑动窗口最大值、347.前 K 个高频元素

学习文章链接:代码随想录


一、150. 逆波兰表达式求值

题目链接:150. 逆波兰表达式求值
思路:使用栈
需要注意的点:注意栈是先进后出,要注意出栈时的运算顺序。要注意如何遍历栈中元素。c++类型转换。
方法1:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        int a,b,c;
        for(int i=0;i<tokens.size();i++){
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
                a=st.top();
                st.pop();
                b=st.top();
                st.pop();
                c=(tokens[i]=="+")?(a+b):(tokens[i]=="-")?(b-a):(tokens[i]=="*")?(a*b):(b/a);
                st.push(c);
            }
            else{
                st.push(stoi(tokens[i],0,10));
            }
        }
        return st.top();
    }
};

二、 239. 滑动窗口最大值

题目链接: 239. 滑动窗口最大值
思路:双向队列
需要注意的点:c++deque的用法,面向对象编程的规则
方法1:

class Solution {
private:
    class Myque{
        public:
        deque<int> que;
        void pop(int a){
            if(!que.empty()&&a==que.front()){
                que.pop_front();
            }
        }
        void push(int a){
            while(!que.empty()&&a>que.back()){
                que.pop_back();
            }
            que.push_back(a);
        }
        int front(){
            return que.front();
        }
    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        Myque que;
        vector<int> results;
        for(int i=0;i<nums.size();i++){
            if(i<k){
                que.push(nums[i]);
                if(i==k-1){
                    results.push_back(que.front());
                }
            }
            else{
                que.pop(nums[i-k]);
                que.push(nums[i]);
                results.push_back(que.front());
            }
        }
        return results;
    }
};

三、347.前 K 个高频元素

题目链接:347.前 K 个高频元素
思路:map统计元素出现频率,小顶堆留下k个频率最大的元素
需要注意的点:对堆的理解,map的表示,priority_queue的用法,如何遍历map和堆
C++ pair的基本用法总结(整理)
C++ | STL | 大顶堆 | 小顶堆 | std::priority_queue
C++ std::map几种遍历方式(正序、倒序)
方法1:

class Solution {
    class compare{
        public:
        bool operator() (const pair<int,int>& x, const pair<int,int>& y){return x.second>y.second;}
    };
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> fre;
        for(int i=0;i<nums.size();i++){
            fre[nums[i]]++;
        }
        priority_queue<pair<int,int>,vector<pair<int,int>>, compare> que;
        for(unordered_map<int, int>::iterator iter=fre.begin();iter != fre.end();iter++){
            que.push(*iter);
            if(que.size()>k){
                que.pop();
            }
        }
        vector<int> results;
        for(int i=0;i<k;i++){
            results.push_back(que.top().first);
            que.pop();
        }
        return results;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值