题目链接: leetcode.
我愿称其为“大哥之争”
啊我绝对做过的啊,可是竟然不知道咋实现了,,提示说用到栈和滑动窗口 (骗子!
用大根堆试了下
依然不对 ,如果一个数是第二大,被pop的时候会依然留在大根堆中
md小破题做了四十分钟都没搞出来 o(TヘTo)
用双向队列维护一串单调递减的数,每次队首都是当前最大值,新队员来的时候,如果比队尾的队员大,就将队尾的队员赶走
(因为要想新队员离开,当前队中的所有人都得离开,而那些本就比新队员小的数,只要新队员没走,永远不会是max,也就没有意义啦,这是一场新队员和比他大的前辈的“max之争”)
/*
执行用时:136 ms, 在所有 C++ 提交中击败了80.45%的用户
内存消耗:47.6 MB, 在所有 C++ 提交中击败了65.84%的用户
*/
class MaxQueue {
queue<int> Q;
deque<int> D;
public:
MaxQueue() {
}
int max_value() {
if(Q.empty())
return -1;
return D.front();
}
void push_back(int value) {
Q.push(value);
while(!D.empty() && value > D.back())
{
D.pop_back();
}
D.push_back(value);
}
int pop_front() {
if(Q.empty())
return -1;
int tmp = Q.front();
Q.pop();
if(tmp == D.front())
D.pop_front();
return tmp;
}
};
本文介绍了一种使用双向队列(deque)维护单调递减数列的方法,以解决LeetCode上的一个问题。作者尝试了大根堆但未成功,最终通过双向队列实现了在O(1)时间内获取最大值和弹出前缀最大值的功能。

被折叠的 条评论
为什么被折叠?



