LeetCode 239滑动窗口最大值
题目链接:239.滑动窗口最大值
- 定义单调队列
//写法一
class Solution {
private:
class MyQue {
public:
deque<int> que;
void pop(int value) {
if (!que.empty() && que.front() == value) {
que.pop_front();
}
}
void push(int value) {
while (!que.empty() && que.back() < value) {
que.pop_back();
}
que.push_back(value);
}
int getFront() {
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQue myQue;
vector<int> ans;
for (int i = 0; i < k; ++i) {
myQue.push(nums[i]);
}
ans.push_back(myQue.getFront());
for (int i = k; i < nums.size(); ++i) {
myQue.pop(nums[i - k]);
myQue.push(nums[i]);
ans.push_back(myQue.getFront());
}
return ans;
}
};
//写法二
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
deque<int> que;
for (int i = 0; i < k; ++i) {
while (!que.empty() && nums[i] > que.back()) {
que.pop_back();
}
que.push_back(nums[i]);
}
ans.push_back(que.front());
for (int i = k; i < nums.size(); ++i) {
if (nums[i - k] == que.front()) {
que.pop_front();
}
while (!que.empty() && nums[i] > que.back()) {
que.pop_back();
}
que.push_back(nums[i]);
ans.push_back(que.front());
}
return ans;
}
};
- 使用优先队列priority_queue()
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
priority_queue<pair<int, int>> pque;
for (int i = 0; i < k; ++i) {
pque.emplace(nums[i], i);
}
ans.push_back(pque.top().first);
for (int i = k; i < nums.size(); ++i) {
pque.emplace(nums[i], i);
while (pque.top().second <= i - k) pque.pop();
ans.push_back(pque.top().first);
}
return ans;
}
};
LeetCode 347前k个高频元素
题目链接:347.前k个高频元素
class Solution {
public:
bool static cmp(const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ans;
unordered_map<int, int> umap;
for (int i = 0; i < nums.size(); ++i) {
umap[nums[i]]++;
}
vector<pair<int, int>> vec(umap.begin(), umap.end());
sort(vec.begin(), vec.end(), cmp);
int count = 0;
for (auto it = vec.begin(); it != vec.end() && count < k; ++it, ++count) {
ans.push_back((*it).first);
}
return ans;
}
};
- 用小顶堆,不用对整个统计频率的数组进行排序,优化时间复杂度
- O(n*logk)
class Solution {
public:
//小顶堆
class cmp {
public:
bool operator() (const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ans(k);
unordered_map<int, int> umap;
for (int i = 0; i < nums.size(); ++i) {
umap[nums[i]]++;
}
//用小顶堆.仅需维护k个元素
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pque;
for (auto it = umap.begin(); it != umap.end(); ++it) {
pque.emplace(*it);
if (pque.size() > k) {
pque.pop();
}
}
for (int i = k - 1; i >= 0; --i) {
ans[i] = pque.top().first;
pque.pop();
}
return ans;
}
};
栈与队列总结
- 以下图片截自代码随想录
- 栈里面的元素在内存中是连续分布的么?
- 滑动窗口最大值
- 求前k个高频元素