【代码随想录|150.逆波兰表达式求值、239.滑动窗口最大值、347.前K个高频元素】

150.逆波兰表达式求值

题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

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

239.滑动窗口最大值

题目链接239. 滑动窗口最大值 - 力扣(LeetCode)

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if (nums.empty() || k <= 0) return {};
    
    int n = nums.size();
    vector<int> result;
    
    for (int i = 0; i <= n - k; ++i) {  // 遍历所有窗口起始位置
        int max_val = nums[i];           // 初始化当前窗口的最大值
        for (int j = i + 1; j < i + k; ++j) {  // 遍历窗口内的元素
            if (nums[j] > max_val) {
                max_val = nums[j];       // 更新最大值
            }
        }
        result.push_back(max_val);       // 记录当前窗口的最大值
    }
    
    return result;
    }
};
class Solution {
public:
    class Mydeque{
    public:
    deque<int> que;
    void push(int val) {
        while (!que.empty() && val > que.back()) { 
            que.pop_back();
        }
        que.push_back(val);
    }
    void pop(int val) {
        if (!que.empty() && val == que.front()){
            que.pop_front();
// 实现的功能是只要不是最大的那个数,就不管.因为这里push维护的是当前k个数最大的数为front

        }
    }
    int front() {
        return que.front();
    }
    };
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        Mydeque que;
        vector<int> result;
        for (int i = 0; i < k; i++) {
            que.push(nums[i]);
        }
        result.push_back(que.front());
        
        for (int i = k; i < nums.size(); i++) {
            que.pop(nums[i-k]); //删掉维护的k个数的前面一个数
            que.push(nums[i]);
            result.push_back(que.front());
//这里的que是一个对象,想要直接像deque调用front是不可能的,所以要另外写一个函数front()返回
        }
        return result;
    }
};

347.前K个高频元素

题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)

class Solution {
public:
    class comparison{
        public:
        bool operator()(const pair<int,int> &ls, const pair<int,int> &rs) {
            return ls.second > rs.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> map;
        for (int i = 0; i < nums.size(); i++) {
            map[nums[i]]++;  // 先记录频率
        }
        priority_queue<pair<int,int>, vector<pair<int,int>>, comparison> que; //进行排序
        for (auto it = map.begin(); it != map.end(); it++) {
            que.push(*it);
            if (que.size() > k) {  // 只维护K个数
                que.pop();
            }
        }
        vector<int> result(k, 0);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = que.top().first;  // 最后倒序输出,因为弹出最小的
            que.pop();
        }
        return result;
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值