LeetCode 239. 滑動視窗最大值

畫船聽雨發表於2018-07-09

題目描述

這裡寫圖片描述

解題思路

線性掃描

藉助一個輔助佇列(雙端佇列),從頭遍歷陣列,根據如下規則進行入佇列或出佇列操作:
1. 如果佇列為空,則當前數字入佇列
2. 如果當前數字大於佇列尾,則刪除佇列尾,直到當前數字小於等於佇列尾,或者佇列空,然後當前數字入佇列
3. 如果當前數字小於佇列尾,則當前數字入佇列
4. 如果佇列頭超出滑動視窗範圍,則刪除佇列頭
這樣能始終保證佇列頭為當前的最大值

程式碼實現

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

};

附:C++雙端佇列用法

//呼叫標頭檔案:

#include<deque>
using namespace std;

//詳細用法(部分):

deque<Type> k;      //------      定義一個deque的變數(定義時已經初始化)      //例如: deque<int> k;

k.empty()      //------      檢視是否為空範例,是的話返回1,不是返回0

k.clear()      //------      清除佇列裡的所有資料

k.push_front(i)      //------      從已有元素前面增加元素i(隊伍大小不預設)

k.push_back(i)      //------      從已有元素後面增加元素i(隊伍大小不預設)

k.pop_front()      //------      清除第一個元素

k.pop_back()      //------      清除最後一個元素

k.front()      //------      顯示第一個元素      例如n = k.front();

k.back()      //------      顯示最後一個元素

k.size()      //------      輸出現有元素的個數

相關文章