数组中的逆序对
个人思路
思路
队列queue+双端队列deque
- queue作为原队列存储数据,deque作为辅助队列存储最大值
- 入队:queue正常入队;deque只存储最有可能成为最大值的元素,并将最大值放在队首,若当前元素比队尾元素大,则队尾元素出队(需要双端队列的pop_back),当前元素入队
- 出队:queue正常出队;若出队元素刚好是deque的队首元素(即最大值),则一同出队,否则只有queue单独出队
个人思路代码
class MaxQueue {
public:
queue<int> q1;//原队列
deque<int> q2;//辅助队列
MaxQueue() {
}
int max_value() {
if(q2.empty()){
return -1;
}else{
int res = q2.front();
return res;
}
}
void push_back(int value) {
q1.push(value);
if(q2.empty()){
q2.push_back(value);
}else{
while(!q2.empty() && q2.back() < value){
q2.pop_back();
}
q2.push_back(value);
}
}
int pop_front() {
if(q1.empty()){
return -1;
}else{
int res = q1.front();
q1.pop();
if(q2.front() == res){
q2.pop_front();
}
return res;
}
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/