1. 程式人生 > 其它 >shell指令碼mysql備份

shell指令碼mysql備份

✔做題思路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;
        }
    };