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;
}
};