当前位置:网站首页>【剑指offer59】队列的最大值
【剑指offer59】队列的最大值
2022-08-04 14:15:00 【星光技术人】
【剑指offer59】队列的最大值
题目辨析:这里的操作pop_front和push_back就是常规双向队列的意义,就是按照先进先出的规则来进行,唯一要做的是,需要实时最新队列的最大元素;
解题技巧:
解题技巧维护一个双向队列,使得队首元素始终是目前队列的最大元素code
class MaxQueue {
public:
deque<int> que;
deque<int> que_M;
MaxQueue() {
}
int max_value() {
if(que.empty())
return -1;
return que_M.front();
}
void push_back(int value) {
que.push_back(value);
while(que_M.size()>0 && que_M.back()<value)
que_M.pop_back();
que_M.push_back(value);
return;
}
int pop_front() {
if(que.empty())
return -1;
int temp = que.front();
if(temp == que_M.front())
que_M.pop_front();
que.pop_front();
return temp;
}
};
- 延申
维护双向队列的最大元素这个技巧在求滑动数组的最大值的时候运用的淋漓尽致
- code
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> que;
vector<int> res;
if(nums.size()==1)
return {
nums[0]};
if(nums.size()<=k)
return {
nums[distance(nums.begin(), max_element(nums.begin(),nums.end()))]};
for(int i=0;i<k;i++)
{
while(!que.empty() && que.back() < nums[i])
que.pop_back();
que.push_back(nums[i]);
}
res.push_back(que.front());
for(int i=k;i<nums.size();i++)
{
if(que.front()==nums[i-k])
que.pop_front();
while(!que.empty() && que.back() < nums[i])
que.pop_back();
que.push_back(nums[i]);
res.push_back(que.front());
}
return res;
}
};
边栏推荐
猜你喜欢
随机推荐
How to play the Tower of Hanoi
《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
Chinese valentine's day, of course, to learn SQL optimization better leave work early to find objects
How to find the location of a pdf file in endnote literature
Almost all known protein structures in the world are open sourced by DeepMind
南瓜科学产品升级 开启益智探索新篇章
[LeetCode] 38. Appearance sequence
ACL 2022 | 社会科学理论驱动的言论建模
快解析结合千方百剂
考研上岸又转行软件测试,从5k到13k完美逆袭,杭州校区小哥哥拒绝平庸终圆梦!
Map common traversal methods - keySet and entrySet
Oracle RAC环境下vip/public/private IP的区别
FreeConfig.h文件
物联网应用发展趋势
化算力为战力:宁夏中卫的数字化转型启示录
Makefile 语法及使用笔记
四平方和,激光炸弹
没有Project Facets的解决方法
谷歌插件.crx文件下载后被自动删除的解决方法