代码随想录算法训练营第十三天| 239. 滑动窗口最大值 、347.前 K 个高频元素

发布时间:2024年01月23日

栈 以下题目主要是利用栈先进先出的特性
注意事项:
1、要确定栈非空才能访问栈顶元素,否则越界

239. 滑动窗口最大值

思路:
用遍历区间的元素时,维护一个单调队列,从大到小排列。
要找到最大值,实际单调队列保存区间内最大值及最大值右侧的第二大值(用于当前最大值处于区间左端,在区间右移时更新临时最大值,只需要用临时最大值和新区间右端元素比较就可以知道新的最大元素)。为什么强调是最大值右侧的第二大值,因为最大值左侧的元素必然在最大值前离开区间。
特殊情况:

代码实现

class Solution {
public:
    bool isValid(string s) {
        stack<char> cSt;
        for(char c : s){
            if(c == '(' || c == '{' || c == '['){
                cSt.push(c);
            }
            else{
                if(cSt.empty()) return false;
                
                if((c == ')' && cSt.top() == '(') || (c == '}' && cSt.top() == '{') || (c == ']' && cSt.top() == '['))              {
                    cSt.pop();
                }
                else{
                    return false;
                }
            }
        }
        if(cSt.empty()) return true;
        return false;
    }
};

347.前 K 个高频元素

思路:

  1. 用unordered_map 保存元素出现频率
  2. 使用优先队列的小顶堆 最小的元素最优先出队(自定义数据结构,重定义排序规则)

特殊情况:

class Solution {
public:
    //自定义数据结构,重定义排序规则
    class mycmp{
        public:
            bool operator()(const pair<int, int> &lfs, const pair<int, int> &rfs){
                return lfs.second > rfs.second;
            }
    };


    vector<int> topKFrequent(vector<int>& nums, int k) {
        //用unordered_map 保存元素出现频率
        unordered_map<int,int> Map;
        for(int num : nums){
            Map[num]++;
        }
        
        //使用优先队列的小顶堆  最小的元素最优先出队
        priority_queue<pair<int,int>, vector<pair<int, int>>, mycmp> pri_que;
        for(auto p : Map){
            pri_que.push(p);
            if(pri_que.size()>k) pri_que.pop();
        }


        vector<int> result(k);
        for(int i = result.size()-1; i >= 0; i--){
            result[i] = pri_que.top().first;
            pri_que.pop();
        }

        return result;
    }
};
文章来源:https://blog.csdn.net/heitong_fu/article/details/135781458
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。