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

239. 滑动窗口最大值

思路:使用deque维护单调降序队列,每次滑动窗口最大值即是该滑动窗口的最大值

template<typename T> 
class Myqueue {//单调队列  单调递减
public:
	class myOncequeue{
	public :
		deque<T> que;					//以deque双端队列为底
		void pop(T value) {				//  pop元素
			//只有在需要删除的滑动窗口前一个元素与pop相等时再pop_front()
			if (!que.empty() && que.front() == value) {			
				que.pop_front();
			}
		}

		void push(T value) {			
			//加入到元素必须按降序排列, 清空小于value的数
			while (!que.empty() && que.back() < value) {			
				que.pop_back();
			}
			que.push_back(value);		//加入value
		}

		T front() {
			return que.front();	//队列头的数字最大
		}
	};

	vector<T> maxSlidingWindow(vector<T>& nums, int k) {
		vector<T> res;
		myOncequeue que;
		for (int i = 0; i < k; i++) {
			que.push(nums[i]);
		}
		res.push_back(que.front());
		for (int i = k; i < nums.size(); i++) {
			que.pop(nums[i - k]);				//先pop滑动窗口前的一个元素
			que.push(nums[i]);
			res.push_back(que.front());
		}
		return res;
	}

	void MaxSlidWinShow(vector<T> nums, int k) {
		vector<T> result = maxSlidingWindow(nums, k);
		cout << "MaxSlidWinShow: " << endl;
		for (auto& c : result) {
			cout << c << ",";
		}
		cout << endl;
	}
};

int main() {
	vector<int> num{ 1,7,4,7,43,8,9,54,87,3,6 };

	vector<int> num3 = num;
	Myqueue<int> q;
	q.MaxSlidWinShow(num3, 3);

	return 0;
}

347.前 K 个高频元素

class Solution {
public:
    class mycmp{		//重载  (), 生成自定义判断机制
    public:
        bool operator()(const pair<int, int> &lhs, const pair<int, int>&rhs){
            return lhs.second > rhs.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>>, mycmp> pri_que;

        //遍历  入队     使用迭代器
        for(unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++){
            pri_que.push(*it);

            if(pri_que.size() > k){		//优先队列数量大于k,则去掉队首元素
                pri_que.pop();
            }
        }

        vector<int> res(k, 0);
        for(int i = k-1; i >= 0; i--){		//逆序遍历  输出降序
            res[i] = pri_que.top().first;
            pri_que.pop();
        }

        return res;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值