day13算法题(明天修改)
239. 滑动窗口最大值 (一刷至少需要理解思路)
之前讲的都是栈的应用,这次该是队列的应用了。
本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。
题目链接/文章讲解/视频讲解:programmercarl.com/0239.%E6%BB…
个人思路:
代码:
class MyQueue{
public:
deque<int> que;
void pop(int value){
if(!que.empty()&&value==que.front())
{
que.pop_front();
}
return;
}
void push(int value){
while(!que.empty()&&value>que.back()) //相等时不做pop操作
{
que.pop_back(); //注意弹出尾部的值
}
que.push_back(value);
}
int getMax(){
return que.front();
}
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
vector<int> result;
MyQueue myQue;
int i = 0;
int j = i+k;
for(int jk=0;jk<k;jk++)
{
myQue.push(nums[jk]);
}
int max = myQue.getMax();
result.push_back(max);
while(j<n)
{
myQue.pop(nums[i]);
myQue.push(nums[j]);
int max=myQue.getMax();
result.push_back(max);
i++;
j++;
}
return result;
}
};
347.前 K 个高频元素 (一刷至少需要理解思路)
大/小顶堆的应用, 在C++中就是优先级队列
本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。
题目链接/文章讲解/视频讲解:programmercarl.com/0347.%E5%89…
思路:
代码:
class Solution {
public:
class mycomparison {
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) {
int n = nums.size();
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++)
{
map[nums[i]]++;
}
// 对频率排序
// 定义一个小顶堆,大小为k
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
// 用固定大小为k的小顶堆,扫面所有频率的数值
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
pri_que.push(*it);
if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
pri_que.pop();
}
}
// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
vector<int> result(k);
for (int i = k - 1; i >= 0; i--) {
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};