deque双向链表 && 剑指offer59Ⅰ&剑指 Offer 59 - II. 队列的最大值

deque
可以在头尾两端分别做元素的插入和删除操作。
1.pop_front();pop_back();push_front();push_back().
2.deque.size();//返回容器中元素的个数;可以用sort排序。
3.deque.empty();//判断容器是否为空
4.deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
5.deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
6.front();//返回第一个数据。back();//返回最后一个数据。
7.insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
8.clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。

剑指offer59Ⅰ滑动窗口的最大值
//滑动窗口的最大值
//设定双端队列 deque 实现非严格递减的单调队列,队首就是当前滑窗内的最大元素
//1 - 当出滑窗的元素恰好是单调队列的队头元素,一起出栈
//2 - 让所有小于新加入元素的单调队列元素出队,新元素入队
//3 - 形成滑窗后,取队首元素加入结果 res
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        //判断特殊情况
        int n = nums.size();
        if(n < k || k <= 0) return {};
        //滑动窗口的前后指针
        int low =  1 - k,high = 0; 
        
        deque<int> dq;//双端队列
        vector<int> res;
        
        while(high < n){
            //判断滑窗的low端是否是最大的元素
            if(low >= 1 && nums[low - 1] == dq[0]) dq.pop_front();
 
            while(!dq.empty() && dq[0] < nums[high]) dq.pop_front();//小于nums[high]的元素出队
            while(!dq.empty() && dq[dq.size()-1] < nums[high]) dq.pop_back();//小于nums[high]的元素出队

            //此时的high指针进队
            dq.push_back(nums[high]);

            if(low >= 0) res.push_back(dq[0]);//当low >= 0,滑窗已经形成
            low ++;
            high ++;
        }
        return res;
    }
};
剑指 Offer 59 - II. 队列的最大值
class MaxQueue {
public:
queue<int>q;
deque<int>dq;

    MaxQueue() {

    }
    
    int max_value() {
        if(dq.empty())return -1;
        else
        return dq.front();
    }
    
    void push_back(int value) {
while(!dq.empty()&&dq.back()<value){
    dq.pop_back();
}
dq.push_back(value);
q.push(value);
    }
    
    int pop_front() {
if(q.empty())return-1;
int tmp=q.front();
if(tmp==dq.front()){
    dq.pop_front();
}
q.pop();
return tmp;
    }
};

/**
 * 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();
 */

你可能感兴趣的:(c++)