Leetcode239滑动窗口最大值 对初始数组为空的处理+deque学习

题目
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值

解题思路
思考:滑动窗口,需要输出窗口中的最大值,第一反应大顶堆,每次进来一个新元素,要把之前的元素踢掉一个,需要记录元素下标。第二种方法,用队列:向右边移动的时候,进来一个新的,就把最左边的去掉(从左边出去),在框内排序找到最大的。同时发现,如果进来一个大的数,比左边框里的一些数大,那么这些小数永远都不可能是最大值,那么把这些小数直接扔掉(从右边出去)。所以得出结论:用双端队列。每进来一个新数,就要存一个最大值到res中。

deque学习
stl:deque常用操作以及特点

代码

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> dq;//队列中存的是下标
        vector<int> res;
        //对特殊情况为空的处理
        if(nums.empty()){return res;}
        for(int i=0;i<nums.size();i++)
        {
            //如果队列的个数等于k了,那么就弹出顶部
            if(!dq.empty()&&dq.front()==i-k){
                dq.pop_front();}
            //进行比较,如果进来的元素大小比最大的,则把之前比它小的元素都去掉
            while(!dq.empty()&&nums[i]>nums[dq.back()]){
                dq.pop_back();}  
             //需要双端队列,一个是滑动窗口的自然滑动,从左边出队pop_front,一个是右边的数比左边的数都大,从右边出队,pop_back(),
            dq.push_back(i);
            //最大值永远是队列的front,即滑动窗口的最左边
            if(i-k+1>=0){
                res.push_back(nums[dq.front()]);
            }
        }
return res;


    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章