LeetCode 239. Sliding Window Maximum

Sliding Window 的问题,初始想法是优先队列,保存下标,如果移除的下标正好是优先队列的top,pop()。时间复杂度应该是O(nlogn)。

题目要求用O(n),可以利用deque,队首为最大元素,如果移除的元素是最大元素,pop_front()。对于新的待加元素,pop_back() 直到队尾元素>=当前元素。

第一次用deque,熟悉一下操作,应该用的不是很多。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int start=0;
        vector<int> res;
        deque<int> q;
        for (int i=0;i<nums.size();++i){
            if (!q.empty() && i>=k && nums[i-k]==q.front()) q.pop_front();
            while (!q.empty() && nums[i]>q.back()) q.pop_back();
            q.push_back(nums[i]);
            if (i+1>=k) res.push_back(q.front());
        }
        return res;
    }
};

 

posted @ 2018-09-11 11:51  約束の空  阅读(90)  评论(0)    收藏  举报