單調佇列與滑動視窗問題總結

2022-09-19 17:45:15 字數 3857 閱讀 6621

leetcode 239. sliding window maximum

可能沒有辦法註冊,就點這裡

給你乙個整數陣列nums,有乙個大小為 \(k\) 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 \(k\) 個數字。滑動視窗每次只向右移動一位。

返回滑動視窗中的最大值。

這道題用暴力顯然是過不了的(時間複雜度\(o(nk)\))。這時候我們就需要……

了解單調佇列,需要知道什麼是單調

這裡用函式的單調性的定義,與這裡的單調也大同小異。

函式的單調性(monotonicity)也可以叫做函式的增減性。當函式 f(x) 的自變數在其定義區間內增大(或減小)時,函式值f(x)也隨著增大(或減小),則稱該函式為在該區間上具有單調性。

單調佇列也是一樣,可以看成佇列的乙個子集,滿足\(\forall i(1 \le i \lt size)\text queue[i] \le queue[i+1]\)或\(\forall i(1 \le i \lt size)\text queue[i] \ge queue[i+1]\)。

需要實現這些功能:

底層容器

由於單調佇列本來就是佇列的變種,stl佇列又基於deque,所以我就私自選擇deque了。

完整**(我還順便加了乙個back()):

struct humdrumqueue 

} void push(int val)

this->q.push_back(val);

} int front()

int back()

int size()

};

其中,pop函式需要判隊首與本數相同。

push則使用大了就出隊的思路。

請自己思考為什麼。

vectormaxslidingwindow(vectornums, int k) 

answer.push_back(hq.front());

for (int i = k; i < int(nums.size()); i++)

return answer;

}

\(\textbf\)leetcode的提交方法有些不同

時間複雜度與空間複雜度為\(o(n)\),完美解決。

p1886 滑動視窗 /【模板】單調佇列

有乙個長為 \(n\) 的序列 \(a\),以及乙個大小為 \(k\) 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。

例如:the array is \([1,3,-1,-3,5,3,6,7]\), and \(k = 3\)。

這道題跟原來的題差不多。

只是新增了乙個最小的。

uva11572 唯一的雪花 unique snowflakes

我用的是另乙個做法:

#include using namespace std;

int a[1000005];

int main()

} void push(int val)

this->q.push_back(val);

} void push2(int val)

this->q.push_back(val);

} int front()

int back()

int size()

};vectormaxslidingwindow(vectornums, int k)

answer.push_back(hq.front());

for (int i = k; i < int(nums.size()); i++)

return answer;

}vectorminslidingwindow(vectornums, int k)

answer.push_back(hq.front());

for (int i = k; i < int(nums.size()); i++)

return answer;

}

其中humdrumqueue.push是大的,humdrumqueue.push2是小的。

單調佇列 滑動視窗

nkoj 2152 description 給你乙個長度為n n 10 6 的陣列,乙個長為k的滑動的窗體從最左移至最右端,你只能見到視窗的k個數,每次窗體向右移動一位,找出窗體所包含的數字的最大和最小值,如下表所示 k的值為3 視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 ...

滑動視窗 單調佇列

給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 3 1 3 5 3...

單調佇列 滑動視窗

p1886 滑動視窗 模板 單調佇列 有乙個長為 n 的序列 a,以及乙個大小為 k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。如果按照暴力方法做的話,每一次判斷相鄰的k個數的最大值和最小值,複雜度為o n k 肯定會超時,因此就想到把每次的最大值和...