shell指令碼mysql備份
阿新 • • 發佈:2022-03-23
✔做題思路or感想:
-
單調佇列可以通過維護單調性去解決區間內最大或最小的問題
- 一般自己造新的DIY佇列時,可以用雙向佇列,更方便
-
這一道題的思路是用單調佇列維護滑動區間內的最大值,使得單調佇列的隊首就是區間內的最大值
- 為了實現這一點,可以這樣來設計:
- pop:如果視窗移除的元素value等於單調佇列的隊首元素,則彈出隊首,否則不操作
- push:如果視窗新增的元素value大於單調佇列的隊尾元素,則彈出隊尾,直到有元素大於等於value,這時再讓value從後面入隊。否則不進行操作
- front:純取隊首元素
class Solution { public: class newQue //設計一個單調佇列 { public: deque<int> que; void pop(int x) { //如果視窗移除的元素value等於單調佇列的隊首元素,則彈出隊首,否則不操作 if (!que.empty() && x == que.front())que.pop_front(); } void push(int x) { //如果視窗新增的元素value大於單調佇列的隊尾元素,則彈出隊尾,直到有元素大於等於 while (!que.empty() && x > que.back()) { que.pop_back(); } que.push_back(x); } int front() { //純取隊首元素 return que.front(); } }; vector<int> maxSlidingWindow(vector<int>& nums, int k) { newQue que; vector<int> result; for(int i = 0; i < k; i++) { //先讓前k個元素入隊,因為下面迴圈是要先從k開始 que.push(nums[i]); } result.push_back(que.front()); for (int i = k; i < nums.size(); i++) { //遇到前n個元素處理,就可以在for迴圈表示式上動功夫,或者在迴圈體動功夫 que.pop(nums[i - k]); //前k個元素的處理可以像這樣子來處理,方便多了 que.push(nums[i]); result.push_back(que.front()); } return result; } };
- 為了實現這一點,可以這樣來設計: