程式碼隨想錄演算法訓練營第23天(補第11天)|150. 逆波蘭表示式求值,239. 滑動視窗最大值

W-Vicky11發表於2024-10-23

150. 逆波蘭表示式求值

文章連結:https://programmercarl.com/0150.逆波蘭表示式求值.html#演算法公開課
題目連結:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        long long result;
        for(int i=0;i<tokens.size();i++){
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
                long long res=0;
                long long num1=st.top();
                st.pop();
                long long num2=st.top();
                st.pop();
                if(tokens[i]=="+") res=num2+num1;
                else if(tokens[i]=="-") res=num2-num1;
                else if(tokens[i]=="*") res=num2*num1;
                else if(tokens[i]=="/") res=num2/num1;
                st.push(res);
            }
            else st.push(stoll(tokens[i]));
        }
        result=st.top();
        return result;
    }
};

239. 滑動視窗最大值

文章連結:https://programmercarl.com/0239.滑動視窗最大值.html#演算法公開課
影片連結:https://www.bilibili.com/video/BV1XS4y1p7qj/?vd_source=6cb513d59bf1f73f86d4225e9803d47b
題目連結:https://leetcode.cn/problems/sliding-window-maximum/

class Solution {
private:
    //實現一種資料結構deque,使得其能完成pop出移走的元素,push新加的元素,並front得到佇列頭元素
    //佇列只維護最大的元素,隊內是遞減的數列
    class Mydeque{
    public:
        deque<int> que;
        //實現pop操作,如果佇列頭元素與滑動視窗移出的元素相同,則真pop
        void pop(int val){
            if(!que.empty()&&val==que.front()) que.pop_front();
        }
        //實現push操作,如果push的時候,前面的值不能大於壓入的值,否則移除前面的值
        void push(int val){
            while(!que.empty()&&que.back()<val) que.pop_back();  //注意:que.back()不可以等於val!!!
            que.push_back(val);
            }
        //佇列頭元素即為我們所求視窗內的最大元素
        int front(){
            return que.front();
        }
    };

public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        Mydeque dq;
        vector<int> result;
        for(int i=0;i<k;i++){
            dq.push(nums[i]);
        }
        result.push_back(dq.front());
        for(int j=k;j<nums.size();j++){
            dq.pop(nums[j-k]);
            dq.push(nums[j]);
            result.push_back(dq.front());
        }
        return result;
    }
};

347.前 K 個高頻元素

文章連結:https://programmercarl.com/0347.前K個高頻元素.html#演算法公開課
影片連結:https://www.bilibili.com/video/BV1Xg41167Lz/?vd_source=6cb513d59bf1f73f86d4225e9803d47b
題目連結:https://leetcode.cn/problems/top-k-frequent-elements/description/

前置知識
priority_queue:
定義:priority_queue<Type, Container, Functional>
Type 就是資料型別,Container 就是容器型別(Container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。STL裡面預設用的是vector),Functional 就是比較的方式,當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大頂堆

//升序佇列
priority_queue <int,vector<int>,greater<int> > q;
//降序佇列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std實現的兩個仿函式(就是使一個類的使用看上去像一個函式。其實現就是類中實現一個operator(),這個類就有了類似函式的行為,就是一個仿函式類了)

————————————————
原文連結:https://blog.csdn.net/weixin_36888577/article/details/79937886

相關文章